开发中,有时需要给一个枚举变量同时设置几个枚举值如:kvo的NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld。那么要使定义的枚举能支持这样操作,需要什么规则呢?
- 在读取时能够从值中判断出包含了哪几个值。
- 在给枚举变量设置值时使用位运算 “|”。
- 从2可以得知,需要在定义枚举时,各个枚举值要在不同的位域。
即同时设置的那几个枚举值是在不同的位域,这样在进行或运算时互不干扰。- 根据3中的结果,在取值时进行相应位域的“&”运算即可知道该位上的值
例子:
typedef enum {
MyOptons1 = 1<<0, // 1左移0位:0b0001
MyOptons2 = 1<<1, // 1左移1位:0b0010
MyOptons3 = 1<<2, // 1左移2位:0b0100
MyOptons4 = 1<<3 // 1左移3位:0b1000
} MyOptons;
// 设置值
MyOptons option = MyOptons1 | MyOptons2 | MyOptons4;
// 读取值
if (option & MyOptons1) {
NSLog(@"包含MyOptons1--");
}
if (option & MyOptons2) {
NSLog(@"包含MyOptons2--");
}
if (option & MyOptons3) {
NSLog(@"包含MyOptons3--");
}
if (option & MyOptons4) {
NSLog(@"包含MyOptons4--");
}
// 上面代码执行的结果是如下: ---- 完全正确
包含MyOptons1--
包含MyOptons2--
包含MyOptons4--