『導(dǎo)言』
開發(fā)中,我們經(jīng)常看到很多的位移枚舉,一般來說,見到位移枚舉,我們都是可以寫多個(gè)
的,用|
來隔開,就能識(shí)別。
其實(shí)按照習(xí)慣的慣例,我們通常看到枚舉,看不懂,就寫個(gè)0
,其實(shí)這樣不好,還是要理解一下枚舉的內(nèi)容,是不是我們想要的。(位移枚舉demo下載)
-
一、步驟:
- 1 )、 自定義一個(gè)
位移枚舉
根據(jù)位移常識(shí),我們得出偏移后的數(shù)值
typedef NS_OPTIONS(NSInteger, ZWJActionType) {
ZWJActionTypeTop = 1<<0, //結(jié)果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
};
- 注意:
-
<<
表示向左移動(dòng); - 公式 :
1
<<n
表示1向左移動(dòng)n位, - 表示:
1*2^n
:1乘以2的n次方
;
-
- ** 2 )、創(chuàng)建一個(gè)方法**
-(void)demo:(ZWJActionType)type
{
NSLog(@"type = %zd",type);//與&結(jié)果為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 )、
調(diào)用
該方法**
[ self demo:ZWJActionTypeTop|ZWJActionTypeRight|ZWJActionTypeLeft|ZWJActionTypeBottom];
- 注意:調(diào)用該方法時(shí)候用
或|
這樣可以枚舉傳遞多個(gè)參數(shù)
- ** 4)、打印結(jié)果:**
2017-03-06 14:42:44.571 07-了解-位移枚舉的簡(jiǎn)單應(yīng)用-zwj[1063:79364] type = 15
2017-03-06 14:42:44.571 07-了解-位移枚舉的簡(jiǎn)單應(yīng)用-zwj[1063:79364] 向上---------1
2017-03-06 14:42:44.571 07-了解-位移枚舉的簡(jiǎn)單應(yīng)用-zwj[1063:79364] 向下---------2
2017-03-06 14:42:44.572 07-了解-位移枚舉的簡(jiǎn)單應(yīng)用-zwj[1063:79364] 向左---------4
2017-03-06 14:42:44.572 07-了解-位移枚舉的簡(jiǎn)單應(yīng)用-zwj[1063:79364] 向右---------8
圖1.算法
圖2.位移枚舉.gif
-
二、 補(bǔ)充:
- 位移枚舉,觀察
第一
個(gè)枚舉值,如果該枚舉值!=0
,那么可以默認(rèn)傳0
做參數(shù),如果傳0做參數(shù),那效率最高(什么都不做)。
- 位移枚舉,觀察
-
例如:
* `NSJSONReadingOptions`位移枚舉
typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
NSJSONReadingMutableContainers = (1UL << 0),//可變的dic arr
NSJSONReadingMutableLeaves = (1UL << 1), //可變的 dic arr 內(nèi)部所有字符串也是可變的,iOS7之后有問題,一般不用
NSJSONReadingAllowFragments = (1UL << 2) //建議:既不是字典也不是數(shù)組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;
-
位移枚舉
優(yōu)點(diǎn)
:- 可以傳遞
多個(gè)值
- 可以傳遞
-
生活中普通枚舉
- 第一種寫法:以前
- 第一種寫法:以前
typedef enum {
ZWJDemoTypeTop,//不能定義類型
ZWJDemoTypeBottom,
}ZWJDemo;
```
* 第二種:可以`定義類型`,如NSInteger
```
typedef NS_ENUM(NSInteger,ZWJType){
ZWJTypeTop,
ZWJTypeBottom,
};
```
-
參考鏈接: