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<

3、枚举的宏(NS_ENUM 与NS_OPTIONS)和enum的区别

NS_ENUM:是用来声明一般的NSInter的类型的枚举。

NS_OPTIONS:是用来声明位掩码。

enum可以声明一般类型和位掩码类型。NS_都是声明位掩码类型。

问题来了,直接用enum不可以吗?苹果建议我们在OC中使用(NS_ENUM 与NS_OPTIONS),因为它们除了推断不出不同类型的枚举,再就是当编译Objective_C++时,它们产生的代码是不同的,在混编时候使用enum会报错。

你可能感兴趣的:(iOS-枚举类型为什么要用<<)