iOS-列舉型別為什麼要用

weixin_34128411發表於2017-09-21

在列舉中我們經常看到<<這樣的位運算子。如果我們在列舉中看到<<那我們就可以通過|(位運算子:或)進行組合使用:

[field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |UIControlEventValueChanged |UIControlEventEditingDidEnd

];

如果沒有<<就是普通資料型別的列舉,不能組合使用。

蘋果官方是怎麼知道我們多個條件組合使用了呢?通過&(位運算子:與)進行判斷:

/**

//通過 & 來判斷是否包含:

UIControlEventEditingDidBegin,

UIControlEventValueChanged,

UIControlEventEditingDidEnd

*/

if (controlEvents & UIControlEventEditingDidBegin) {

NSLog(@"UIControlEventEditingDidBegin");

}else if (controlEvents & UIControlEventValueChanged) {

NSLog(@"UIControlEventValueChanged");

}else if (controlEvents & UIControlEventEditingDidEnd) {

NSLog(@"UIControlEventEditingDidEnd");

}

typedef NS_OPTIONS(NSInteger,myTests){

testA = 1 << 0

testB = 1<<1

testC = 1<<2

testD = 1<<3

}

typedef enum{

testA = 1 << 0

testB = 1<<1

testC = 1<<2

testD = 1<<3

}myTests;

testA = 1 << 0  :值為1(2的0次方)

testB = 1<<1   :值為2 (2的1次方)

testC = 1<<2

testD = 1<<3

通過&進行判斷我們來看看輸出結果如下圖:

NSInterger value = testA |testB;

NSlog(@“%zd,%zd,%zd,%zd”,value&testA,value&testB,value&testC,value&testD)結果:1,2,0,0;

a<<b:左移:就是把運算元轉化為二進位制後向左b位,在後面添b個0.

3、列舉的巨集(NS_ENUM 與NS_OPTIONS)和enum的區別

NS_ENUM:是用來宣告一般的NSInter的型別的列舉。

NS_OPTIONS:是用來宣告位掩碼。

enum可以宣告一般型別和位掩碼型別。NS_都是宣告位掩碼型別。

問題來了,直接用enum不可以嗎?蘋果建議我們在OC中使用(NS_ENUM 與NS_OPTIONS),因為它們除了推斷不出不同型別的列舉,再就是當編譯Objective_C++時,它們產生的程式碼是不同的,在混編時候使用enum會報錯。

相關文章