
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è)枚舉值條件,這就是我們說的位移枚舉

想知道 << 使用和理解的推薦看: iOS 枚舉的巧用里面有詳細(xì)講解這個(gè)<<,這里不多描述
2.先看OC的寫法
在OC中我們使用nsoptions來快速敲出位移枚舉


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è)氣

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

這是看別人的解釋 當(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
祝大家早日富可敵國