0

我有一个成员变量,它告诉我测量的值的单位,如厘米、公里、秒、小时等。

现在这些是枚举,当我显示相应的字符串时,我创建了一个方法,为这些枚举返回相应的字符串。

与 Java 不同,这里的枚举不能有其他相关的属性。

所以我必须明确地做一个 if-else-if 链或一个 switch case 来返回正确的字符串。

我是 Objective C 的新手。在这种情况下我应该遵循什么好的做法?

4

3 回答 3

1

afaik Objective-C 枚举只是老式的 C 枚举......所以也许你可以为它们使用整数值?

于 2012-04-04T13:07:15.520 回答
0

我猜如果您的枚举值从 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
}

但是与不使用宏相比,您并没有真正节省那么多。

于 2012-04-04T13:25:07.867 回答
0

马丁詹姆斯的评论是正确的答案。并使用枚举的定义,例如:

enum units { cm = 0, m, km };

这样您就可以确保您的枚举转换为正确的索引值。

于 2012-04-04T13:28:39.130 回答