在枚举中我们经常看到<<这样的位运算符。如果我们在枚举中看到<<那我们就可以通过|(位运算符:或)进行组合使用:
[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会报错。
网友评论