『前言』
枚举值是一个整形(int),并且它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.在代码中使用枚举的目的只有一个,那就是增加代码的可读性.
iOS 常用的枚举有两种类型,分别是NS_ENUM和NS_OPTIONS,
普通使用推荐枚举NS_ENUM方式,
需要安位或操作组合的方式就使用枚举NS_OPTIONS,还有个功能就是可以多选
1.创建位移枚举
先创建一个普通的枚举
typedefNS_ENUM(NSUInteger,YLEnum){YLEnumTop=1,// 0000 0001YLEnumBottom,// 0000 0010YLEnumLeft,// 0000 0011YLEnumRight,// 0000 0100};
根据以往的开发经验可以知道YLEnumTop的枚举值是1,YLEnumBottom是2,YLEnumLeft是3,YLEnumRight是4,后面的注释 是转化为二进制后的值
再创一个简单的位移枚举,表示着 上、下、左、右 四个方向
typedefNS_OPTIONS(NSUInteger,YLOptions){YLOptionsTop=1<<0,// 0000 0001YLOptionsBottom=1<<1,// 0000 0010YLOptionsLeft=1<<2,// 0000 0100YLOptionsRight=1<<3,// 0000 1000};
注释:
<<表示向左移动;
表示 :1<<n表示1向左移动n位,
计算公式 :1*2^n1乘以2的n次方;
PS: 位移枚举 YLOptions 第一个枚举值是 YLOptionsTop , 如果该枚举值!=0,那么可以默认传0做参数,这时效率最高(因为在方法optionsDemo:中可以什么都不用做了)
<<位移符移动方法
举个🌰:
YLOptionsLeft=1<<2,// 0000 0100
<<符号前面的1表示基础数值,即要在1的基础上向左移动2位
1的二进制表示为0000 0001,
向左移动2位后的结果就是0000 0100,这个时候YLOptionsLeft的枚举值就变成了4了
经过位移移动后YLOptions的枚举值就可以看成是
typedefNS_OPTIONS(NSUInteger,YLOptions){YLOptionsTop=1,// 0000 0001YLOptionsBottom=2,// 0000 0010YLOptionsLeft=4,// 0000 0100YLOptionsRight=8,// 0000 1000};
举个🌰:
YLOptionsLeft = 3 << 1,
3的二进制是0000 0011,
移动1位后是0000 0110,
YLOptionsLeft的枚举值就成了 6
公式计算的话就是 3*2^1 = 6。
2.位移枚举的使用
普通枚举NS_ENUM判断可以使用if else和switch
位移枚举NS_OPTIONS的判断方法如下:
-(void)optionsDemo:(YLOptions)type{if(type&YLOptionsTop){NSLog(@"上 %ld",type&YLOptionsTop);}if(type&YLOptionsBottom){NSLog(@"下 %ld",type&YLOptionsBottom);}if(type&YLOptionsLeft){NSLog(@"左 %ld",type&YLOptionsLeft);}if(type&YLOptionsRight){NSLog(@"右 %ld",type&YLOptionsRight);}}
方法调用
[self optionsDemo:YLOptionsTop|YLOptionsRight];
会有两个打印输出
2018-08-21 13:39:34.750480+0800 Demo[20332:1760218] 上 12018-08-21 13:39:34.750586+0800 Demo[20332:1760218] 右 8
这样就实现了多选功能,多个枚举值 要使用| 或符号
解析方法的调用
方法调用
[self optionsDemo:YLOptionsTop|YLOptionsRight];
这时的type是YLOptionsTop | YLOptionsRight
多选时,用加法来进行枚举的叠加,减法来进行枚举的删除
//多选时,用加法来进行枚举的叠加,减法来进行枚举的删除//根据打印可以知道 type == 9// type 是 top 和 right 相加得来的// 0000 0001 + 0000 1000 = 0000 1001 即为 9-(void)optionsDemo:(YLOptions)type{//根据下面的 按位运算 就可以计算出结果了//1001 & 0001 0001if(type&YLOptionsTop){NSLog(@"上 %ld",type&YLOptionsTop);}//1001 & 0010 0000if(type&YLOptionsBottom){NSLog(@"下 %ld",type&YLOptionsBottom);}//1001 & 0100 0000if(type&YLOptionsLeft){NSLog(@"左 %ld",type&YLOptionsLeft);}//1001 & 1000 1000if(type&YLOptionsRight){NSLog(@"右 %ld",type&YLOptionsRight);}}
也可以这样理解
理解1://1001 & 1000 1000 转成十进制是 8 是>0的 那么 1001 & 1000 是真的,就会有打印输出if(type&YLOptionsRight){NSLog(@"右 %ld",type&YLOptionsRight);}理解2:(type&YLOptionsRight)与 的 二进制值是1000对应的枚举值是 YLOptionsRight 这样写 会清晰一些if((type&YLOptionsRight)==YLOptionsRight){NSLog(@"右 %ld",type&YLOptionsRight);}
3.按位运算
按位与 &运算 :
1 & 1 = 1 1 & 0 = 0 0 & 0 = 0总结规则:有0则为0 即:一假则假
按位或 |运算:
1|1=11|0=10|0=0总结规则:有1则为1即:一真则真
4.二进制的与 、或 运算
举个🌰:
0000 0010和0000 0100相或 和 相与
二进制的与或运算,是每一位的对比运算,而不是总体所代表的值的对比运算
1.0000 0010|0000 0100
根据上面的按位运算, 前四位都是0 咱简单的只对比后四位
0010按位运算符0100结果
第一位0或00
第二位0或11
第三位1或01
第四位0或00
结果就是0110
这样就可以看出 之前说的 传参是YLOptionsTop | YLOptionsRight,为什么type的结果是9了
2.0000 0010&0000 0100
0010按位运算符0100结果
第一位0与00
第二位0与10
第三位1与00
第四位0与00
结果是0000
网友评论