美文网首页
iOS开发中常用枚举?位移枚举?原理?

iOS开发中常用枚举?位移枚举?原理?

作者: 随心吧 | 来源:发表于2017-03-06 15:12 被阅读222次
    『导言』

    开发中,我们经常看到很多的位移枚举,一般来说,见到位移枚举,我们都是可以写多个的,用|来隔开,就能识别。
    其实按照习惯的惯例,我们通常看到枚举,看不懂,就写个0,其实这样不好,还是要理解一下枚举的内容,是不是我们想要的。(位移枚举demo下载

    • 一、步骤:
    • 1 )、 自定义一个位移枚举
     根据位移常识,我们得出偏移后的数值
    typedef NS_OPTIONS(NSInteger, ZWJActionType) {
        ZWJActionTypeTop = 1<<0,  //结果1*2(0)= 1
        ZWJActionTypeBottom = 1<<1,// 1*2(1) = 2
        ZWJActionTypeLeft = 1<<2,// 1*2(2) = 4
        ZWJActionTypeRight = 1<<3,// 1*2(3) = 8
    };
    
    • 注意:
      • <<表示向左移动;
      • 公式 : 1<<n 表示1向左移动n位,
      • 表示:1*2^n1乘以2的n次方
    • ** 2 )、创建一个方法**
     -(void)demo:(ZWJActionType)type
    {
        NSLog(@"type = %zd",type);//与&结果为15
        
        if (type & ZWJActionTypeTop) {
            NSLog(@"向上---------%ld",type & ZWJActionTypeTop);
        }
        if (type & ZWJActionTypeBottom) {
            NSLog(@"向下---------%ld",type&ZWJActionTypeBottom);
        }
        if (type & ZWJActionTypeLeft) {
            NSLog(@"向左---------%ld",type&ZWJActionTypeLeft);
        }
        if (type & ZWJActionTypeRight) {
            NSLog(@"向右---------%ld",type&ZWJActionTypeRight);
        }
    }
    
    • ** 3 )、调用该方法**
        [ self demo:ZWJActionTypeTop|ZWJActionTypeRight|ZWJActionTypeLeft|ZWJActionTypeBottom];
    
    • 注意:调用该方法时候用或|这样可以枚举传递多个参数
    • ** 4)、打印结果:**
    2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] type = 15
    2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] 向上---------1
    2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] 向下---------2
    2017-03-06 14:42:44.572 07-了解-位移枚举的简单应用-zwj[1063:79364] 向左---------4
    2017-03-06 14:42:44.572 07-了解-位移枚举的简单应用-zwj[1063:79364] 向右---------8
    
    图1.算法
    图2.位移枚举.gif
    • 二、 补充:
      • 位移枚举,观察第一个枚举值,如果该枚举值!=0,那么可以默认传0做参数,如果传0做参数,那效率最高(什么都不做)。
    • 例如:

        *  `NSJSONReadingOptions`位移枚举
      
       typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
           NSJSONReadingMutableContainers = (1UL << 0),//可变的dic arr
           NSJSONReadingMutableLeaves = (1UL << 1),     //可变的 dic arr 内部所有字符串也是可变的,iOS7之后有问题,一般不用
           NSJSONReadingAllowFragments = (1UL << 2)  //建议:既不是字典也不是数组dic arr
           } NS_ENUM_AVAILABLE(10_7, 5_0);
    
       * 传`0` 或者 ** `kNilOptions`**
    
        NSDictionary *dic =  [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];//传0 或者  kNilOptions
    
    * `与或`分析:
       * 按位`与& `  只要`有0则为0`
          例如: 1&0 == 0;0&0 == 0;1&1 == 1;
        
     * 按位`或 | `   只要`有1则1` 
        例如:   1|0 = 1; 0|0 = 0; 1|1= 1;
    
    • 位移枚举优点

      • 可以传递多个值
    • 生活中普通枚举

      • 第一种写法:以前

    typedef enum {
    ZWJDemoTypeTop,//不能定义类型
    ZWJDemoTypeBottom,
    }ZWJDemo;
    ```

    *  第二种:可以`定义类型`,如NSInteger
     ```
    

    typedef NS_ENUM(NSInteger,ZWJType){
    ZWJTypeTop,
    ZWJTypeBottom,
    };
    ```

    • 参考链接:

    1、枚举&位移枚举(推荐)
    2、位移枚举

    相关文章

      网友评论

          本文标题:iOS开发中常用枚举?位移枚举?原理?

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