• 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");
        }

    打印结果: 





  • 相关阅读:
    设计模式1 设计模式概述
    关于jdk的配置
    搭建webpack项目框架
    移动乐淘day1
    前后端开发(2):浏览器与PHP程序的交互
    Ajax中post与get的区别
    Web前端:2、盒模型的组成
    Web前端:1、HTML&CSS概述及结构
    VMware11虚拟机安装Redhat6.5视频演示
    VMware虚拟机中安装Linux系统步骤(Redhat6.5)
  • 原文地址:https://www.cnblogs.com/zhangliukou/p/8875138.html
Copyright © 2020-2023  润新知