在枚舉中我們經(jīng)秤悼蹋看到<<這樣的位運(yùn)算符昌犹。如果我們在枚舉中看到<<那我們就可以通過|(位運(yùn)算符:或)進(jìn)行組合使用:
[field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |UIControlEventValueChanged |UIControlEventEditingDidEnd
];
如果沒有<<就是普通數(shù)據(jù)類型的枚舉监婶,不能組合使用。
蘋果官方是怎么知道我們多個(gè)條件組合使用了呢宛蚓?通過&(位運(yùn)算符:與)進(jìn)行判斷:
/**
//通過 & 來判斷是否包含:
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
通過&進(jìn)行判斷我們來看看輸出結(jié)果如下圖:
NSInterger value = testA |testB激捏;
NSlog(@“%zd,%zd,%zd,%zd”,value&testA,value&testB,value&testC,value&testD)結(jié)果:1,2凄吏,0远舅,0;
a<<b:左移:就是把操作數(shù)轉(zhuǎn)化為二進(jìn)制后向左b位痕钢,在后面添b個(gè)0.
3图柏、枚舉的宏(NS_ENUM 與NS_OPTIONS)和enum的區(qū)別
NS_ENUM:是用來聲明一般的NSInter的類型的枚舉。
NS_OPTIONS:是用來聲明位掩碼任连。
enum可以聲明一般類型和位掩碼類型蚤吹。NS_都是聲明位掩碼類型。
問題來了随抠,直接用enum不可以嗎裁着?蘋果建議我們在OC中使用(NS_ENUM 與NS_OPTIONS),因?yàn)樗鼈兂送茢嗖怀霾煌愋偷拿杜e拱她,再就是當(dāng)編譯Objective_C++時(shí)二驰,它們產(chǎn)生的代碼是不同的,在混編時(shí)候使用enum會(huì)報(bào)錯(cuò)秉沼。