『导言』
开发中,我们经常看到很多的位移枚举,一般来说,见到位移枚举,我们都是可以写多个
的,用|
来隔开,就能识别。
其实按照习惯的惯例,我们通常看到枚举,看不懂,就写个0
,其实这样不好,还是要理解一下枚举的内容,是不是我们想要的。(位移枚举demo下载)
-
一、步骤:
- 1 )、 自定义一个
位移枚举
根据位移常识,我们得出偏移后的数值
typedef NS_OPTIONS(NSInteger, ZWJActionType) {
ZWJActionTypeTop = 1<<0, //结果1*2(0)= 1
ZWJActionTypeBottom = 1<<1,// 1*2(1) = 2
ZWJActionTypeLeft = 1<<2,// 1*2(2) = 4
ZWJActionTypeRight = 1<<3,// 1*2(3) = 8
};
- 注意:
-
<<
表示向左移动; - 公式 :
1
<<n
表示1向左移动n位, - 表示:
1*2^n
:1乘以2的n次方
;
-
- ** 2 )、创建一个方法**
-(void)demo:(ZWJActionType)type
{
NSLog(@"type = %zd",type);//与&结果为15
if (type & ZWJActionTypeTop) {
NSLog(@"向上---------%ld",type & ZWJActionTypeTop);
}
if (type & ZWJActionTypeBottom) {
NSLog(@"向下---------%ld",type&ZWJActionTypeBottom);
}
if (type & ZWJActionTypeLeft) {
NSLog(@"向左---------%ld",type&ZWJActionTypeLeft);
}
if (type & ZWJActionTypeRight) {
NSLog(@"向右---------%ld",type&ZWJActionTypeRight);
}
}
- ** 3 )、
调用
该方法**
[ self demo:ZWJActionTypeTop|ZWJActionTypeRight|ZWJActionTypeLeft|ZWJActionTypeBottom];
- 注意:调用该方法时候用
或|
这样可以枚举传递多个参数
- ** 4)、打印结果:**
2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] type = 15
2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] 向上---------1
2017-03-06 14:42:44.571 07-了解-位移枚举的简单应用-zwj[1063:79364] 向下---------2
2017-03-06 14:42:44.572 07-了解-位移枚举的简单应用-zwj[1063:79364] 向左---------4
2017-03-06 14:42:44.572 07-了解-位移枚举的简单应用-zwj[1063:79364] 向右---------8
-
二、 补充:
- 位移枚举,观察
第一
个枚举值,如果该枚举值!=0
,那么可以默认传0
做参数,如果传0做参数,那效率最高(什么都不做)。
- 位移枚举,观察
-
例如:
* `NSJSONReadingOptions`位移枚举
typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
NSJSONReadingMutableContainers = (1UL << 0),//可变的dic arr
NSJSONReadingMutableLeaves = (1UL << 1), //可变的 dic arr 内部所有字符串也是可变的,iOS7之后有问题,一般不用
NSJSONReadingAllowFragments = (1UL << 2) //建议:既不是字典也不是数组dic arr
} NS_ENUM_AVAILABLE(10_7, 5_0);
* 传`0` 或者 ** `kNilOptions`**
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];//传0 或者 kNilOptions
* `与或`分析:
* 按位`与& ` 只要`有0则为0`
例如: 1&0 == 0;0&0 == 0;1&1 == 1;
* 按位`或 | ` 只要`有1则1`
例如: 1|0 = 1; 0|0 = 0; 1|1= 1;
-
位移枚举
优点
:- 可以传递
多个值
- 可以传递
-
生活中普通枚举
- 第一种写法:以前
- 第一种写法:以前
typedef enum {
ZWJDemoTypeTop,//不能定义类型
ZWJDemoTypeBottom,
}ZWJDemo;
```
* 第二种:可以`定义类型`,如NSInteger
```
typedef NS_ENUM(NSInteger,ZWJType){
ZWJTypeTop,
ZWJTypeBottom,
};
```
-
参考链接: