在单独的类中定义未知枚举的原因是什么?

时间:2014-12-09 09:12:56

标签: ios objective-c oop

在Apple Lister示例中https://developer.apple.com/library/ios/samplecode/Lister/Listings/Objective_C_ListerKit_AAPLListInfo_m.html#//apple_ref/doc/uid/TP40014701-Objective_C_ListerKit_AAPLListInfo_m-DontLinkElementID_35

他们有这个代码来定义颜色枚举的其他未定义状态

#define AAPLListColorUndefined ((AAPLListColor)-1)
...
#undef AAPLListColorUndefined

但为什么不将它们添加到他们定义其他颜色的类

typedef NS_ENUM(NSInteger, AAPLListColor) {
    AAPLListColorGray = 0,
    AAPLListColorBlue,
    AAPLListColorGreen,
    AAPLListColorYellow,
    AAPLListColorOrange,
    AAPLListColorRed
};

这背后有原因吗?或者只是一种没有任何好处的个人风格。

1 个答案:

答案 0 :(得分:3)

请注意,AAPLListColorUndefined仅在其声明的文件中使用 (甚至在该文件的末尾特别未定义。)它基本上是一个仅在该类中使用的辅助值(用于跟踪颜色是否已设置。)与其他值不同,它仅在该类中有用。所以,这个设计理由是:它不是真正的一个颜色值;它基本上只是该特定类中使用的标志。

第二个原因是编译器将在switch语句中检查NS_ENUM值的完整性。尝试将AAPLListColorUndefined添加到枚举本身 - 您现在可以看到switch语句的编译器警告,如下所示:

// Warning: Enumeration value 'AAPLListColorUndefined' not handled in switch
switch (listColor) {
    case AAPLListColorGray:     return _grayColor;
    case AAPLListColorBlue:     return _blueColor;
    case AAPLListColorGreen:    return _greenColor;
    case AAPLListColorYellow:   return _yellowColor;
    case AAPLListColorOrange:   return _orangeColor;
    case AAPLListColorRed:      return _redColor;
}

...因为编译器可以看到未定义的值未被处理。由于该值只能在该特定类中 未定义,因此使NS_ENUM中的其他类可用,因为这将迫使您处理它,当你知道你的颜色值在逻辑上不能在它们中被定义。 (在其他文件中,使用默认的灰色,因此不需要"未定义的"值 - 始终定义颜色。)

那就是"翻转方面"设计原因:除了在它定义的一个文件中有用之外,它特别在它未被使用的文件中有用。

这是非常整洁的代码,我要说。如果您要将未定义的颜色添加为枚举的一部分,那么您需要在使用枚举的每个switch语句中执行某些,即使它只有{{1没有做任何事情的案件,或者提出了一个你知道永远不会发生的错误。

或者,您可以通过将color属性设置为默认值(例如灰色)与其他文件一样,在default:中完全没有未定义的值,但是您需要额外的flag-a boolean,可能表示是否已获取列表信息。