iOS-列舉型別為什麼要用
在列舉中我們經常看到<<這樣的位運算子。如果我們在列舉中看到<<那我們就可以通過|(位運算子:或)進行組合使用:
[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會報錯。
相關文章
- 列舉型別型別
- 為什麼說列舉更佔記憶體,列舉原理是什麼?記憶體
- ENUM列舉型別型別
- java列舉型別Java型別
- java 列舉型別Java型別
- 為什麼要用docker?Docker
- 為什麼要用dockerDocker
- 為什麼要用RedisRedis
- Java - Enum 列舉型別Java型別
- dedecms聯動型別裡,知道列舉值,如何轉換為列舉名型別
- java中的列舉型別Java型別
- JavaSE基礎:列舉型別Java型別
- mysql之ENUM列舉型別MySql型別
- 為什麼要用SOCKS代理?
- 為什麼要用混合加密?加密
- 【C++】資料型別-列舉型C++資料型別
- 為什麼Javascript需要型別?JavaScript型別
- 單例模式中為什麼用列舉更好單例模式
- C++ 列舉型別介紹C++型別
- 列舉型別分享 第五節型別
- java基礎(十一) 列舉型別Java型別
- Python 中的列舉型別Python型別
- 列舉型別與位運算型別
- 10-列舉型別和流型別
- 關於C++列舉型別C++型別
- 為什麼要用Node.jsNode.js
- 我們為什麼要用RedisRedis
- 為什麼要用Redis叢集?Redis
- 為什麼要用資料中臺
- 為什麼要用 Node.jsNode.js
- 為什麼要用單例模式?單例模式
- 為什麼要用工廠模式模式
- JPA不識別MySQL的列舉型別MySql型別
- OC中列舉寫法 以及 字串型別列舉實現探索字串型別
- Rust 列舉類是什麼Rust
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- java中的列舉型別學習Java型別
- Java基礎教程(15)–列舉型別Java型別