OC&Swift位移枚舉使用

image

1.前言

1.什么是位移枚舉?

如我們在寫代碼中經(jīng)常用過或者是見過的這種寫法的枚舉 通過 | (位運(yùn)算符或)進(jìn)行組合使用 如:

//隨便添加一個(gè)UITextField
 UITextField *field = [UITextField new];
 //給UITextField添加   Begin,Changed,DidEnd觸發(fā)的事件 用  "|"來添加多個(gè)觸發(fā)條件
 [field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |
  UIControlEventValueChanged | UIControlEventEditingDidEnd
     ];
    
 [self.view addSubview:field];

我們點(diǎn)進(jìn) forControlEvents 需要的這個(gè)枚舉類型 UIControlEvents 里我們可以看到和普通枚舉不同多了個(gè)<<符號,有這種<<符號,就支持用 | 來多個(gè)枚舉值條件,這就是我們說的位移枚舉

image.png

想知道 << 使用和理解的推薦看: iOS 枚舉的巧用里面有詳細(xì)講解這個(gè)<<,這里不多描述

2.先看OC的寫法

在OC中我們使用nsoptions來快速敲出位移枚舉

image.png
效果如下:
image.png

OC 定義一個(gè)表示方向的位移枚舉含(上下左右) 舉個(gè)栗子:

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

OC中使用剛剛定義的位移枚舉 :

 self.type = DirectionTypeUp | DirectionTypeLeft;//使用"|"來表示使用多個(gè)枚舉

OC中位移枚舉的變量使用按位與(&)來判斷 舉個(gè)栗子 :

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

看累了給自己打個(gè)氣

image.png

2.Swift位移枚舉使用

Swift 位枚舉使用結(jié)構(gòu)體(struct) 并結(jié)構(gòu)體要遵從 OptionSet協(xié)議,以引入選項(xiàng)集合,而不是用枚舉(enum)要表示。為什么這樣處理呢? 我也不知道

image.png

這是看別人的解釋 當(dāng)枚舉成員互斥的時(shí)候,比如說,一次只有一個(gè)選項(xiàng)可以被選擇的情況下,枚舉是非常好的。但是和 C 不同,在 Swift 中,你無法把多個(gè)枚舉成員組合成一個(gè)值,而 C 中的枚舉對編譯器來說就是整型,編譯器可以接受任意整數(shù)值

遵從 OptionSet

如何創(chuàng)建你自己的選項(xiàng)集合類型呢?僅有的要求是,一個(gè)類型為整型的原始值(rawValue)和一個(gè)初始化構(gòu)造器。對于結(jié)構(gòu)體來說,Swift 通常都會(huì)自動(dòng)提供一個(gè)逐一成員構(gòu)造器(memberwise initializer),所以你并不需要自己寫一個(gè)。rawValue 是位域底層的存儲(chǔ)單元。每個(gè)選項(xiàng)都應(yīng)該是靜態(tài)的常量,并使用適當(dāng)?shù)闹党跏蓟似湮挥?/p>

Swift定義一個(gè)表示方向的位移枚舉含(上下左右) 舉個(gè)栗子 :
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)
}

*** 注意編譯器并沒有自動(dòng)把 2 的整數(shù)次冪按照升序賦給你的選項(xiàng)——這些工作應(yīng)該由你來做,你需要正確地賦值,使得每個(gè)選項(xiàng)代表 rawValue 中的其中一個(gè)位。如果你給選項(xiàng)賦予了連續(xù)的整數(shù)(1,2,3,...),就會(huì)導(dǎo)致無法分辨出值

Swift使用這位移枚舉 舉個(gè)栗子 :
let  direction: directionType = [.top, .right, .down]
direction.contains(.top)  // → true
direction.contains(.left)   // → false

1.添加多個(gè)枚舉值條件Swift 不再是用| 而是用[.xxx,.xxx] 類似于數(shù)組的方式 添加多個(gè)枚舉值條件
2.判斷 位移枚舉的變量是否存在 Swift 不再是用& 而是用.contains()

end

祝大家早日富可敵國

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容