枚举NS_OPTIONS与NS_ENUM的区别与写法

第一种:NS_OPTIONS

typedefNS_OPTIONS(NSUInteger,UISwipeGestureRecognizerDirection) {

UISwipeGestureRecognizerDirectionNone=0,//值为0UISwipeGestureRecognizerDirectionRight=1<<0,//值为2的0次方UISwipeGestureRecognizerDirectionLeft=1<<1,//值为2的1次方UISwipeGestureRecognizerDirectionUp=1<<2,//值为2的2次方UISwipeGestureRecognizerDirectionDown=1<<3//值为2的3次方

};

小括号中第一个为NSUInteger这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须全部包含小括号的枚举类型,枚举项后面再跟上几个值的区别,这里枚举项是NSUInteger类型,当然也可以像下方这样写枚举,但是官方推荐格式为上面那种。

typedef enum{

UISwipeGestureRecognizerDirectionNone=0,//值为0UISwipeGestureRecognizerDirectionRight=1<<0,//值为2的0次方UISwipeGestureRecognizerDirectionLeft=1<<1,//值为2的1次方UISwipeGestureRecognizerDirectionUp=1<<2,//值为2的2次方UISwipeGestureRecognizerDirectionDown=1<<3//值为2的3次方

}UISwipeGestureRecognizerDirection;

我比较喜欢下面的这种写法,C++里面的习惯吧

第二种:NS_ENUM

小括号中第一个为NSInteger这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须包含小括号中自己定义的枚举类型,枚举项自己加后缀以视区别,大括号中的枚举项的值可自定义,若是定义了枚举项其中一项的值后面依次在它的前一项的值上加1,如这样:

typedef NS_ENUM(NSInteger,NSWritingDirection) {

NSWritingDirectionNatural=-1,//值为-1    

NSWritingDirectionLeftToRight=0,//值为0

NSWritingDirectionRightToLeft=1//值为1      

 };

跟第一种基本格式相同,唯一不同的是小括号里面数字变量的类型,NS_OPTIONS 是NSUInteger 而 NS_ENUM 类型为NSInteger

当然下面还可以这样写:

typedef NS_ENUM(NSInteger,NSWritingDirection) {

NSWritingDirectionNatural=0,//值为0    

NSWritingDirectionLeftToRight,//值为1

NSWritingDirectionRightToLeft//值为2      

};

//或者这样:

typedef  NS_ENUM(NSInteger,NSWritingDirection) {

NSWritingDirectionNatural=0,//值为0   

 NSWritingDirectionLeftToRight=2,//值为2

NSWritingDirectionRightToLeft//值为3    

  };//若是都不定义值,默认第一项为0,后面依次枚举项的值加1。

 当然也可以下方这样写枚举,但是官方不推荐:

typedef enum{

NSWritingDirectionNatural=-1,//值为-1    

NSWritingDirectionLeftToRight=0,//值为0

NSWritingDirectionRightToLeft=1//值为1 

 }NSWritingDirection;

第三区别:NS_ENUM与NS_OPTIONS区别

NS_ENUM枚举项的值为NSInteger,NS_OPTIONS枚举项的值为NSUInteger;

这里为什么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger。(这里为什么会出现NS_OPTIONS与NS_ENUM且为什么不直接一个就行,且枚举值可多选。因为有个是否将代码按照C++模式编译,若是不按照C++模式编译,NS_OPTIONS与NS_ENUM展开方式就一样,若是要按照C++模式编译,就不同了。在使用或运算操作两个枚举值时,C++默认为运算结果的数据类型是枚举的底层数据类型即NSUInteger,且C++不允许它隐式转换为枚举类型本身,所以需要用NS_OPTIONS这个宏来定义。这里主要是防止代码按C++模式编译。(如果是这个枚举值只需要使用一个的话,就可以用NS_ENUM定义;像UI那种使用多个枚举值的,就使用NS_OPTIONS)按位或操作,,与NS_ENUM有所不同,C++不允许“隐式转换”。

NS_ENUM定义通用枚举,NS_OPTIONS定义位移枚举

位移枚举即是在你需要的地方可以同时存在多个枚举值 如:

UISwipeGestureRecognizer*swipeRecognizer = [[UISwipeGestureRecognizer alloc] init]; 

 swipeRecognizer.direction =UISwipeGestureRecognizerDirectionDown|UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight;//这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右

而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,如:

NSMutableParagraphStyle*paragraph = [[NSMutableParagraphStylealloc] init];paragraph.baseWritingDirection =NSWritingDirectionNatural;

NS_OPTIONS的枚举项的值需要像这样表示1 << 0,1 << 1,2的几次方这样,而NS_ENUM可以直接给像1,2,3这样。为什么要这样,具体原理可以看这里(https://www.jianshu.com/p/a3477662425a)会解决心中的疑惑。

总结:学习,写作,激励,努力。

你可能感兴趣的:(枚举NS_OPTIONS与NS_ENUM的区别与写法)