他们有这个代码来定义颜色枚举的其他未定义状态
#define AAPLListColorUndefined ((AAPLListColor)-1)
...
#undef AAPLListColorUndefined
但为什么不将它们添加到他们定义其他颜色的类
typedef NS_ENUM(NSInteger, AAPLListColor) {
AAPLListColorGray = 0,
AAPLListColorBlue,
AAPLListColorGreen,
AAPLListColorYellow,
AAPLListColorOrange,
AAPLListColorRed
};
这背后有原因吗?或者只是一种没有任何好处的个人风格。
答案 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,可能表示是否已获取列表信息。