NS_ENUM VS. NS_OPTIONS

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容