NS_ENUM VS. NS_OPTIONS

作者: 死神一护 | 来源:发表于2017-08-30 13:13 被阅读159次
    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

    相关文章

      网友评论

      • iwasee:UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
        swipeGR.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;

        只能感应一个方向

      本文标题:NS_ENUM VS. NS_OPTIONS

      本文链接:https://www.haomeiwen.com/subject/nlctjxtx.html