typedef NS_ENUM与typedef enum的区别

17
采用现代Objective-C指南中,苹果建议使用NS_ENUM宏而不是枚举。我还阅读了NSHipster关于NS_ENUM和NS_OPTIONS的解释。
也许我错过了什么,但我不太明白以下两个片段之间的区别,如果有的话,为什么NS_ENUM是推荐的方法(除了与旧编译器的向后兼容性)。
// typedef enum
typedef enum {
    SizeWidth,
    SizeHeight
}Size;

// typedef NS_ENUM
typedef NS_ENUM(NSInteger, Size) {
    SizeWidth,
    SizeHeight
};

你有检查过 NS_ENUM 宏的作用吗? - holex
我读到过这样的内容:“NS_ENUM宏有助于定义枚举的名称和类型,例如在此处定义了名为UITableViewCellStyle的NSInteger类型。枚举类型应该是NSInteger。”唯一不同的地方就是类型。 - Alex Salom
2
为什么你不去看那个宏的源代码,找一下线索呢?在Xcode里面都可以免费获取,并且只需点击一下就能找到。 - pronebird
2个回答

22

首先,NS_ENUM使用C语言的一种新特性,您可以为枚举指定基础类型。在此情况下,枚举的底层类型是NSInteger(在普通的C语言中,它取决于编译器的决定,可能是char、short,甚至是一个24位的整数,如果编译器觉得合适的话)。

其次,编译器专门识别NS_ENUM宏,因此它知道您有一个枚举具有不应该像标志一样组合的值,调试器知道发生了什么,并且枚举可以自动转换为Swift。


14

NS_ENUM允许您定义一种类型。这意味着编译器可以检查您是否将枚举分配给另一个变量,例如:

//OK in both cases
NSInteger integer = SizeWidth;
//OK only with typedef
BOOL value = SizeHeight;

NS_ENUM还可以在switch语句中提供检查,以确保涵盖了所有可能的值:

//Will generate warning if using NS_ENUM
switch(sizeVariable) {
    case SizeWidth:
        //Do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接