Objective c typedef NS_枚举与typedef枚举

Objective c typedef NS_枚举与typedef枚举,objective-c,enums,Objective C,Enums,在指南中,苹果建议使用NS_ENUM宏而不是ENUM。我还阅读了有关NS_枚举和NS_选项的说明 也许我遗漏了一些东西,但我不太明白以下两个代码片段之间的区别,如果有的话,为什么NS_ENUM是推荐的方法(可能是为了与旧编译器向后兼容) NS_ENUM允许您定义类型。这意味着编译器可以检查是否将枚举分配给不同的变量,如下所示: //OK in both cases NSInteger integer = SizeWidth; //OK only with typedef BOOL value =

在指南中,苹果建议使用NS_ENUM宏而不是ENUM。我还阅读了有关NS_枚举和NS_选项的说明

也许我遗漏了一些东西,但我不太明白以下两个代码片段之间的区别,如果有的话,为什么
NS_ENUM
是推荐的方法(可能是为了与旧编译器向后兼容)


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
}

首先,NS_ENUM使用C语言的一个新特性,您可以在其中指定枚举的基础类型。在本例中,枚举的底层类型是NSInteger(在纯C中,它将是编译器决定的任何类型,char、short,甚至是24位整数,如果编译器喜欢的话)


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

您是否检查了
NS_ENUM
宏的功能?我读到“该
NS_ENUM
宏有助于定义枚举的名称和类型,在本例中命名为类型NSInteger的UITableViewCellStyle。枚举的类型应为NSInteger。”我在这句话中看到的唯一区别是类型为什么不检查一下宏的源代码以获得线索,它都是在Xcode中免费提供的,只需点击一下。
//Will generate warning if using NS_ENUM
switch(sizeVariable) {
    case SizeWidth:
        //Do something
}