我有一个成员变量,它告诉我测量的值的单位,如厘米、公里、秒、小时等。
现在这些是枚举,当我显示相应的字符串时,我创建了一个方法,为这些枚举返回相应的字符串。
与 Java 不同,这里的枚举不能有其他相关的属性。
所以我必须明确地做一个 if-else-if 链或一个 switch case 来返回正确的字符串。
我是 Objective C 的新手。在这种情况下我应该遵循什么好的做法?
我有一个成员变量,它告诉我测量的值的单位,如厘米、公里、秒、小时等。
现在这些是枚举,当我显示相应的字符串时,我创建了一个方法,为这些枚举返回相应的字符串。
与 Java 不同,这里的枚举不能有其他相关的属性。
所以我必须明确地做一个 if-else-if 链或一个 switch case 来返回正确的字符串。
我是 Objective C 的新手。在这种情况下我应该遵循什么好的做法?
afaik Objective-C 枚举只是老式的 C 枚举......所以也许你可以为它们使用整数值?
我猜如果您的枚举值从 0 开始并增加,您可以使用某种数组访问:
const char *distanceUnitToString2(enum DistanceUnit unit)
{
const char *values[] = {
"cm",
"m",
"km"
};
// do some sanity checking here
// ...
return values[unit];
}
但这对我来说有点片状。如果您有负值,或者您使用的是位掩码样式的枚举值,例如1 << 8
怎么办?您最终将使用一个非常大的数组。
您也可以使用开关并通过宏对其进行一些改进。像这样的东西:
const char *distanceUnitToString(enum DistanceUnit unit)
{
#define CASE(UNIT, STRING) case (UNIT): return (STRING)
switch (unit) {
CASE(kCentimeters, "cm");
CASE(kMeters, "m");
CASE(kKiloMeters, "km");
default:
// should not get here
assert(0);
break;
}
#undef CASE
}
但是与不使用宏相比,您并没有真正节省那么多。
马丁詹姆斯的评论是正确的答案。并使用枚举的定义,例如:
enum units { cm = 0, m, km };
这样您就可以确保您的枚举转换为正确的索引值。