美文网首页MT iOS
OC&Swift位移枚举使用

OC&Swift位移枚举使用

作者: SuDream | 来源:发表于2019-01-04 10:24 被阅读6次
    image

    1.前言

    1.什么是位移枚举?

    如我们在写代码中经常用过或者是见过的这种写法的枚举 通过 | (位运算符或)进行组合使用 如:

    //随便添加一个UITextField
     UITextField *field = [UITextField new];
     //给UITextField添加   Begin,Changed,DidEnd触发的事件 用  "|"来添加多个触发条件
     [field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |
      UIControlEventValueChanged | UIControlEventEditingDidEnd
         ];
        
     [self.view addSubview:field];
    

    我们点进 forControlEvents 需要的这个枚举类型 UIControlEvents 里我们可以看到和普通枚举不同多了个<<符号,有这种<<符号,就支持用 | 来多个枚举值条件,这就是我们说的位移枚举

    image.png

    想知道 << 使用和理解的推荐看: iOS 枚举的巧用里面有详细讲解这个<<,这里不多描述

    2.先看OC的写法

    在OC中我们使用nsoptions来快速敲出位移枚举

    image.png 效果如下: image.png

    OC 定义一个表示方向的位移枚举含(上下左右) 举个栗子:

        typedef NS_OPTIONS(NSUInteger, DirectionType) {
            DirectionTypeUp      = 1 << 0,
            DirectionTypeLeft    = 1 << 1,
            DirectionTypeDown    = 1 << 2,
            DirectionTypeRight   = 1 << 3,
        };
    

    OC中使用刚刚定义的位移枚举 :

     self.type = DirectionTypeUp | DirectionTypeLeft;//使用"|"来表示使用多个枚举
    

    OC中位移枚举的变量使用按位与(&)来判断 举个栗子 :

     if(self.type & DirectionTypeUp)
      {
           NSLog(@"上")
      }
      if(self.type & DirectionTypeLeft)
      {
           NSLog(@"左")
      }
      ..............
      ..............
    
    

    看累了给自己打个气

    image.png

    2.Swift位移枚举使用

    Swift 位枚举使用结构体(struct) 并结构体要遵从 OptionSet协议,以引入选项集合,而不是用枚举(enum)要表示。为什么这样处理呢? 我也不知道

    image.png

    这是看别人的解释 当枚举成员互斥的时候,比如说,一次只有一个选项可以被选择的情况下,枚举是非常好的。但是和 C 不同,在 Swift 中,你无法把多个枚举成员组合成一个值,而 C 中的枚举对编译器来说就是整型,编译器可以接受任意整数值

    遵从 OptionSet

    如何创建你自己的选项集合类型呢?仅有的要求是,一个类型为整型的原始值(rawValue)和一个初始化构造器。对于结构体来说,Swift 通常都会自动提供一个逐一成员构造器(memberwise initializer),所以你并不需要自己写一个。rawValue 是位域底层的存储单元。每个选项都应该是静态的常量,并使用适当的值初始化了其位域

    Swift定义一个表示方向的位移枚举含(上下左右) 举个栗子 :
    struct directionType: OptionSet {
        let rawValue: Int
        static let all = directionType(rawValue: 1)
        static let top = directionType(rawValue: 2)
        static let right = directionType(rawValue: 4)
        static let down = directionType(rawValue: 8)
        static let left = directionType(rawValue: 16)
    }
    

    *** 注意编译器并没有自动把 2 的整数次幂按照升序赋给你的选项——这些工作应该由你来做,你需要正确地赋值,使得每个选项代表 rawValue 中的其中一个位。如果你给选项赋予了连续的整数(1,2,3,...),就会导致无法分辨出值

    Swift使用这位移枚举 举个栗子 :
    let  direction: directionType = [.top, .right, .down]
    direction.contains(.top)  // → true
    direction.contains(.left)   // → false
    

    1.添加多个枚举值条件Swift 不再是用| 而是用[.xxx,.xxx] 类似于数组的方式 添加多个枚举值条件
    2.判断 位移枚举的变量是否存在 Swift 不再是用& 而是用.contains()

    end

    祝大家早日富可敌国

    相关文章

      网友评论

        本文标题:OC&Swift位移枚举使用

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