美文网首页
NS_OPTIONS与NS_ENUM的区别与使用

NS_OPTIONS与NS_ENUM的区别与使用

作者: anna_hui | 来源:发表于2018-01-16 09:19 被阅读0次

    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这个为固定值,第二个为枚举类型,当然也可以像下方这样写枚举,但是官方推荐格式为上面那种。

    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这样。

    总结:

    到了这我们就知道了只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM。

    参考:https://www.jianshu.com/p/30f76a950604

    相关文章

      网友评论

          本文标题:NS_OPTIONS与NS_ENUM的区别与使用

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