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