处理枚举时如何避免if else或switch case?

时间:2012-04-04 13:02:37

标签: objective-c

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

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

与Java不同,此处的枚举不能与其相关联。

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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
}

但是你并没有真正节省那么多而不是使用宏。

答案 2 :(得分:0)

Martin James的评论是正确的答案。并使用枚举的定义,如:

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

通过这种方式,您可以确保您的枚举转换为正确的索引值。