NS_ENUM VS. NS_OPTIONS

NS_ENUM VS. NS_OPTIONS_第1张图片
UITableView中枚举类型例子.png

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

你可能感兴趣的:(NS_ENUM VS. NS_OPTIONS)