NS_ENUM
从iOS6开始,苹果开始使用NS_ENUM和 NS_OPTIONS宏替代原来的C风格的enum进行枚举类型的定义。
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
NS_OPTIONS
通过按位掩码的方式也可以进行枚举类型的定义
typedef NS_OPTIONS(NSUInteger, UITableViewCellStateMask) {
UITableViewCellStateDefaultMask = 0,
UITableViewCellStateShowingEditControlMask = 1 << 0,
UITableViewCellStateShowingDeleteConfirmationMask = 1 << 1
};
两者的区别
- NS_ENUM枚举项的值为NSInteger,NS_OPTIONS枚举项的值为NSUInteger
- NS_ENUM定义通用枚举,NS_OPTIONS定义位移枚举
位移枚举即是在你需要的地方可以同时存在多个枚举值如这样:
UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
swipeGR.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
而NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,像这样:
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionLeftToRight;
PS : 判断一个枚举类型的变量为某个值的时候,不用 == ,而是用按位与:
if (swipeGR.direction & UISwipeGestureRecognizerDirectionUp)
结论:只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM