typedef NS_ENUM vs typedef enum

时间:2014-11-28 15:21:10

标签: objective-c enums

Adopting Modern Objective-C指南中,Apple建议使用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
};

2 个答案:

答案 0 :(得分:18)

首先,NS_ENUM使用C语言的新功能,您可以在其中指定枚举的基础类型。在这种情况下,枚举的基础类型是NSInteger(在普通C中它将是编译器决定的任何内容,如果编译器感觉它,则为char,short或甚至24位整数)。

其次,编译器专门识别NS_ENUM宏,因此它知道你有一个枚举值,不应该像标志一样组合,调试器知道发生了什么,枚举可以是自动翻译成Swift。

答案 1 :(得分:13)

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
}