MT iOS

OC&Swift位移枚举使用

2019-01-04  本文已影响6人  SuDream
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

祝大家早日富可敌国

上一篇 下一篇

猜你喜欢

热点阅读