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

沙鲁

在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
};

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

马特·吉布森

请注意,该属性在声明的文件中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语句中进行一些操作default:永远不会发生。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

错误的原因是什么:类MyBean上的“未知属性”?

来自分类Dev

错误的原因是什么:类MyBean上的“未知属性”?

来自分类Dev

用[Flags]属性标记枚举的原因是什么?

来自分类Dev

javascript中结果的原因是什么?

来自分类Dev

在Java中拥有3个类加载器的原因是什么

来自分类Dev

将实例变量移动到装饰器模式中的抽象类的原因是什么?

来自分类Dev

使用lambda表达式在Scheme中定义函数的原因是什么?

来自分类Dev

在Isabelle / HOL中公理化“未定义”的原因是什么?

来自分类Dev

在类内部初始化字段的原因是什么?

来自分类Dev

静态声明辅助类方法的原因是什么?

来自分类Dev

静态声明辅助类方法的原因是什么

来自分类Dev

在 EF 中定义 DBContext 时调用基类的构造函数背后的原因是什么?有没有其他方法可以做到?

来自分类Dev

RejctedExecutionException的原因是什么?

来自分类Dev

BufferOverflowException的原因是什么?

来自分类Dev

输出提示中[1]的名称和原因是什么?

来自分类Dev

在XML模式中避免匿名类型的原因是什么?

来自分类Dev

Chrome解析URI中的双点的原因是什么?

来自分类Dev

MySQL中重复唯一索引的原因是什么

来自分类Dev

SQL中的LEFT和Right连接的原因是什么

来自分类Dev

在Python中,冲洗是如何工作的,原因是什么?

来自分类Dev

在apache wicket中获取对象模型的原因是什么?

来自分类Dev

JSON中此错误的可能原因是什么?

来自分类Dev

我的代码中StringIndexOutOfBoundsException的原因是什么

来自分类Dev

C中这种狡猾的内存泄漏的原因是什么

来自分类Dev

下述代码中左值错误的原因是什么?

来自分类Dev

C中访问分段错误的原因是什么

来自分类Dev

mysql查询中的计数不同的原因是什么?

来自分类Dev

在XML模式中避免匿名类型的原因是什么?

Related 相关文章

  1. 1

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

  2. 2

    错误的原因是什么:类MyBean上的“未知属性”?

  3. 3

    错误的原因是什么:类MyBean上的“未知属性”?

  4. 4

    用[Flags]属性标记枚举的原因是什么?

  5. 5

    javascript中结果的原因是什么?

  6. 6

    在Java中拥有3个类加载器的原因是什么

  7. 7

    将实例变量移动到装饰器模式中的抽象类的原因是什么?

  8. 8

    使用lambda表达式在Scheme中定义函数的原因是什么?

  9. 9

    在Isabelle / HOL中公理化“未定义”的原因是什么?

  10. 10

    在类内部初始化字段的原因是什么?

  11. 11

    静态声明辅助类方法的原因是什么?

  12. 12

    静态声明辅助类方法的原因是什么

  13. 13

    在 EF 中定义 DBContext 时调用基类的构造函数背后的原因是什么?有没有其他方法可以做到?

  14. 14

    RejctedExecutionException的原因是什么?

  15. 15

    BufferOverflowException的原因是什么?

  16. 16

    输出提示中[1]的名称和原因是什么?

  17. 17

    在XML模式中避免匿名类型的原因是什么?

  18. 18

    Chrome解析URI中的双点的原因是什么?

  19. 19

    MySQL中重复唯一索引的原因是什么

  20. 20

    SQL中的LEFT和Right连接的原因是什么

  21. 21

    在Python中,冲洗是如何工作的,原因是什么?

  22. 22

    在apache wicket中获取对象模型的原因是什么?

  23. 23

    JSON中此错误的可能原因是什么?

  24. 24

    我的代码中StringIndexOutOfBoundsException的原因是什么

  25. 25

    C中这种狡猾的内存泄漏的原因是什么

  26. 26

    下述代码中左值错误的原因是什么?

  27. 27

    C中访问分段错误的原因是什么

  28. 28

    mysql查询中的计数不同的原因是什么?

  29. 29

    在XML模式中避免匿名类型的原因是什么?

热门标签

归档