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

Ios 在单独的类中定义未知枚举的原因是什么?,ios,objective-c,oop,Ios,Objective C,Oop,以苹果李斯特为例 他们有此代码来定义颜色枚举的其他未定义状态 #define AAPLListColorUndefined ((AAPLListColor)-1) ... #undef AAPLListColorUndefined 但是为什么他们不把这个添加到他们定义其他颜色的类中呢 typedef NS_ENUM(NSInteger, AAPLListColor) { AAPLListColorGray = 0, AAPLListColorBlue, AAPLList

以苹果李斯特为例

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

#define AAPLListColorUndefined ((AAPLListColor)-1)
...
#undef AAPLListColorUndefined
但是为什么他们不把这个添加到他们定义其他颜色的类中呢

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

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

请注意,
AAPLListColorUndefined
仅在声明的文件中使用(甚至在该文件的末尾没有明确定义)。它基本上是一个仅在该类中使用的帮助器值(用于跟踪颜色是否已设置)。与其他值不同,它只在那一节课上有用。所以,这就是设计原因之一:它不是一个真正的颜色值;它基本上只是那个特定类中使用的一个标志

第二个原因是编译器将检查
switch
语句中的NS_枚举值的完整性。尝试将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_枚举中不提供该值是有意义的,因为当您知道颜色值在逻辑上无法定义时,这将迫使您处理该值。(在其他文件中,使用默认的灰色,因此不需要“未定义”值,因为颜色总是定义的。)

所以,这就是设计原因的“反面”:它只在定义的一个文件中有用,但在没有使用它的文件中却没有特别的用处

我认为这是非常整洁的代码。如果要添加未定义的颜色作为枚举的一部分,则需要在使用枚举的每个switch语句中执行某些操作,即使它只有一个
默认值:
case没有执行任何操作,或者引发了一个您知道永远不会发生的错误


或者,您可以通过将Color属性设置为默认值(如灰色)而不必在
AAPLListInfo.m
中使用未定义的值,就像其他文件一样,但是您需要一个额外的标志—一个布尔值,可能用于指示是否已获取列表信息。

看起来他们试图在此处模拟Swift选项,是吗?@MichałCiuba是的;在Swift中,您可以在ListInfo类中将该属性声明为可选的,只需检查它是否为nil,看看它是否已经加载。这就不那么晦涩了,这是一个很好的例子,说明了optionals可以派上用场。这是有意义的,未定义的东西模仿的是状态,而不是真实的颜色值。