iOS NS_OPTIONS 位移枚举

2022-07-01  本文已影响0人  一代枭雄

『前言』

枚举值是一个整形(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

上一篇 下一篇

猜你喜欢

热点阅读