zoukankan      html  css  js  c++  java
  • NS_OPTIONS与NS_ENUM

    开发中常用NS_ENUMNS_OPTIONS来定义枚举,二者有何区别?使用时该如何抉择呢?

    总结:只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM。

    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这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须全部包含小括号的枚举类型,枚举项后面再跟上几个值的区别,这里枚举项是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;
    UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init]; swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight; 

    //这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右
    NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,像这样:
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.baseWritingDirection = NSWritingDirectionNatural;
     

    使用:

    typedef NS_OPTIONS(NSInteger, TestType) {
        TestTypeOne   = 1 << 1,  // 0001 --> 0010 = 2
        TestTypeTwo   = 1 << 2,  // 0001 --> 0100 = 4
        TestTypeThree = 1 << 3,  // 0001 --> 1000 = 8
    };
    TestType type = TestTypeOne | TestTypeTwo; //00000010 + 00000100 = 00000110 -> 6
        if (type & TestTypeOne) {  //00000110 & 00000010 = 00000010 -> 2
            NSLog(@"包含 one");
        }
        if (type & TestTypeTwo) {  //00000110 & 00000100 = 00000100 -> 4
            NSLog(@"包含 two");
        }
        if (type & TestTypeThree) { //00000110 & 00001000 = 00000000 -> 0
            NSLog(@"包含 three");
        }

    打印结果:

    开发中常用NS_ENUMNS_OPTIONS来定义枚举,二者有何区别?使用时该如何抉择呢?

    总结:只要枚举值需要用到按位或(2个及以上枚举值可多个存在)就使用NS_OPTIONS,否则使用NS_ENUM。

    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这个为固定值,第二个为枚举类型,自己定义,大括号中枚举项必须全部包含小括号的枚举类型,枚举项后面再跟上几个值的区别,这里枚举项是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;
    UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init]; swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight; 

    //这里几个枚举项同时存在表示它的方向同时包含1.向下2.向左3.向右
    NS_ENUM定义的枚举不能几个枚举项同时存在,只能选择其中一项,像这样:
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.baseWritingDirection = NSWritingDirectionNatural;
     

    使用:

    typedef NS_OPTIONS(NSInteger, TestType) {
        TestTypeOne   = 1 << 1,  // 0001 --> 0010 = 2
        TestTypeTwo   = 1 << 2,  // 0001 --> 0100 = 4
        TestTypeThree = 1 << 3,  // 0001 --> 1000 = 8
    };
    TestType type = TestTypeOne | TestTypeTwo; //00000010 + 00000100 = 00000110 -> 6
        if (type & TestTypeOne) {  //00000110 & 00000010 = 00000010 -> 2
            NSLog(@"包含 one");
        }
        if (type & TestTypeTwo) {  //00000110 & 00000100 = 00000100 -> 4
            NSLog(@"包含 two");
        }
        if (type & TestTypeThree) { //00000110 & 00001000 = 00000000 -> 0
            NSLog(@"包含 three");
        }

    打印结果: 





  • 相关阅读:
    hive 之with....as的用法
    hive 之lateral view 函数用法
    linux 之 bash: telnet: command not found...报错
    mysql 之 一个库中所有表复制到另一个数据库中,实现两个表迁移
    mysql 之group by 后取每一组最大的一行值
    kettle 报错 Error converting characters into server's character set. Some character(s) could not be converted.
    mysql 之数据类型转换cast()函数和convert()函数
    hive 之基础知识及查询三
    hive 之基础知识及语法二
    Vue(十)
  • 原文地址:https://www.cnblogs.com/zhangliukou/p/8875138.html
Copyright © 2011-2022 走看看