概述
NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionNone = 0, // 值为0
UISwipeGestureRecognizerDirectionRight = 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, // 值为0
UISwipeGestureRecognizerDirectionRight = 1 << 0, // 值为2的0次方
UISwipeGestureRecognizerDirectionLeft = 1 << 1, // 值为2的1次方
UISwipeGestureRecognizerDirectionUp = 1 << 2, // 值为2的2次方
UISwipeGestureRecognizerDirectionDown = 1 << 3 // 值为2的3次方
} UISwipeGestureRecognizerDirection;
NS_ENUM
typedef NS_ENUM(NSInteger, NSWritingDirection) {
NSWritingDirectionNatural = -1, // 值为-1
NSWritingDirectionLeftToRight = 0, // 值为0
NSWritingDirectionRightToLeft = 1 // 值为1
};
小括号中第一个为NSInteger
这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须包含小括号中自己定义的枚举类型,枚举项自己加后缀以视区别,大括号中的枚举项的值可自定义,若是定义了枚举项其中一项的值后面依次在它的前一项的值上加1,如这样:
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_ENUM
定义通用枚举,NS_OPTIONS
定义位移枚举
位移枚举即是在你需要的地方可以同时存在多个枚举值如这样:UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init]; swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight; // 这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右 // 而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,像这样: NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.baseWritingDirection = NSWritingDirectionNatural;
NS_OPTIONS
的枚举项的值需要像这样表示1 << 0,1 << 1,2的几次方这样,而NS_ENUM
可以直接给像1,2,3这样。
总结:
这里为什么会出现NS_OPTIONS
与NS_ENUM
且为什么不直接一个就行,且枚举值可多选。因为有个是否将代码按照C++模式编译,若是不按照C++模式编译,NS_OPTIONS
与NS_ENUM
展开方式就一样,若是要按照C++模式编译,就不同了。在使用或运算操作两个枚举值时,C++默认为运算结果的数据类型是枚举的底层数据类型即NSUInteger
,且C++不允许它隐式转换为枚举类型本身,所以C++模式下定义了NS_OPTIONS
宏以保证不出现类型转换。
到了这我们就知道了只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS
,否则使用NS_ENUM
。
最后
以上就是无限冬日为你收集整理的Objective-C NS_OPTIONS与NS_ENUM的区别与格式NS_OPTIONSNS_ENUMNS_ENUM与NS_OPTIONS区别总结:的全部内容,希望文章能够帮你解决Objective-C NS_OPTIONS与NS_ENUM的区别与格式NS_OPTIONSNS_ENUMNS_ENUM与NS_OPTIONS区别总结:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复