什么是枚舉
在程序設計語言中,一般用一個數值來代表某一狀態,這種處理方法不直觀,易讀性差。如果能在程序中用自然語言中有相應含義的單詞來代表某一狀態,則程序就很容易閱讀和理解。也就是說,事先考慮到某一變量可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值,這種方法稱為枚舉方法,用這種方法定義的類型稱枚舉類型。
枚舉的命名
定義的枚舉類型名稱通常與項目的類文件前綴相同,或者是類庫框架縮寫,或者跟隨具體業務名,如果開頭是縮寫要大寫表示,跟隨其后的命名應采用駝峰命名法則,命名應準確表述枚舉表示的意義,枚舉中各個值都應以定義的枚舉類型開頭,其后跟隨各個枚舉值對應的狀態、選項或者狀態碼。
狀態與選項(states & options)
狀態
同時只能有一種,如JFStateError
,JFStateUnknow
,不可能同時是JFStateError
和JFStateUnknow
。如下:
typedef enum JFState {
JFStateOK = 0,
JFStateError,
JFStateUnknow
} JFState;
另外,我們經常在switch語句中使用枚舉來表示各個狀態,根據各個狀態來進項判斷。如下
JFState state = JFStateOK;
switch (state)
{
case JFStateOK:
{
}
break;
case JFStateError:
{
}
break;
case JFStateUnknow:
{
}
break;
}
這里大家總是習慣在switch語句中加上default分支,但是在使用枚舉來定義狀態的時候筆者不建議大家這么做。主要有以下幾點:
- 使用枚舉時,所需判斷的幾種狀態是確認可控的,不需要在進行default的判斷
- 在之后的拓展中,如果加入了新的枚舉類型,則編譯器會發出警告提示開發者switch未處理所有枚舉信息,提示新加入的枚舉未在switch中進行處理,如果加上default分之的話就不會有該判斷
選項
定義選項的時候。若這些選項可以彼此組合,則更應如此。只要枚舉定義得對,各選項之間就可通過“按位或操作符”(bitwise OR operator)來組合。例如,iOS UI框架中有如下枚舉類型,用來表示某個視圖應該如何在水平或垂直方向上調整大小。
位移枚舉(可復選的枚舉) 使用位移實現選項變量
使用枚舉定義選項,每個選項均可啟用或禁用,使用上述方式來定義枚舉值,每個枚舉值所對應的二進制表示中,只有1個二進制位的值是1。用“按位或操作符”可組合多個選項。用 | 來隔開
首先來補充下位運算的知識吧 _
- 1、按位與"&"
只有對應的兩個二進位均為1時,結果位才為1,否則為0>比如9&5,其實就是1001&0101=0001,因此9&5=1>二進制中,與1相&就保持原位,與0相&就為0
- 2、按位或"|"
只要對應的二個二進位有一個為1時,結果位就為1,否則為0。>比如9|5,其實就是1001|0101=1101,因此9|5=13
- 3、左移<<
把整數a的各二進位全部左移n位,高位丟棄,低位補0。左移n位其實就是乘以2的n次方。>例如1<<2 就是0001左移2為0100,因此1<<2=4
枚舉定義如下:
typedef NS_OPTIONS(NSUInteger, ActionType) {
ActionTypeUp = 1 << 0, // 0001 1
ActionTypeDown = 1 << 1, // 0010 2
ActionTypeRight = 1 << 2, // 0100 4
ActionTypeLeft = 1 << 3, // 1000 8
};
枚舉判斷處理:
- (void)action:(ActionType)type
{
if (type == 0)
{
return;
}
if ((type & ActionTypeUp) == ActionTypeUp)
{
NSLog(@"上");
}
if ((type & ActionTypeDown) == ActionTypeDown)
{
NSLog(@"下");
}
if ((type & ActionTypeLeft) == ActionTypeLeft)
{
NSLog(@"左");
}
if ((type & ActionTypeRight) == ActionTypeRight)
{
NSLog(@"右");
}
}
于是,調用的時候我們通常這么寫
ActionType type = ActionTypeUp | ActionTypeLeft | ActionTypeRight | ActionTypeDown; // 15
[self action:type];
- 定義這個actionType的選項為四個,這里按位異或,0001|0010|0100|1000=1111,得到結果這個type為15。
- 調用方法
[self action:type]
,進行按位與操作:type & ActionTypeUp
,1111&0001=0001,得到這個是否選擇了該選項。然后便可以進行判斷了。