什么是枚舉
在程序設(shè)計語言中碳想,一般用一個數(shù)值來代表某一狀態(tài)宋渔,這種處理方法不直觀弹灭,易讀性差督暂。如果能在程序中用自然語言中有相應(yīng)含義的單詞來代表某一狀態(tài),則程序就很容易閱讀和理解穷吮。也就是說逻翁,事先考慮到某一變量可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值捡鱼,這種方法稱為枚舉方法八回,用這種方法定義的類型稱枚舉類型。
枚舉的命名
定義的枚舉類型名稱通常與項目的類文件前綴相同驾诈,或者是類庫框架縮寫,或者跟隨具體業(yè)務(wù)名,如果開頭是縮寫要大寫表示缠诅,跟隨其后的命名應(yīng)采用駝峰命名法則,命名應(yīng)準確表述枚舉表示的意義乍迄,枚舉中各個值都應(yīng)以定義的枚舉類型開頭管引,其后跟隨各個枚舉值對應(yīng)的狀態(tài)、選項或者狀態(tài)碼闯两。
狀態(tài)與選項(states & options)
狀態(tài)
同時只能有一種褥伴,如JFStateError
,JFStateUnknow
谅将,不可能同時是JFStateError
和JFStateUnknow
。如下:
typedef enum JFState {
JFStateOK = 0,
JFStateError,
JFStateUnknow
} JFState;
另外重慢,我們經(jīng)常在switch語句中使用枚舉來表示各個狀態(tài)饥臂,根據(jù)各個狀態(tài)來進項判斷。如下
JFState state = JFStateOK;
switch (state)
{
case JFStateOK:
{
}
break;
case JFStateError:
{
}
break;
case JFStateUnknow:
{
}
break;
}
這里大家總是習慣在switch語句中加上default分支似踱,但是在使用枚舉來定義狀態(tài)的時候筆者不建議大家這么做隅熙。主要有以下幾點:
- 使用枚舉時,所需判斷的幾種狀態(tài)是確認可控的屯援,不需要在進行default的判斷
- 在之后的拓展中猛们,如果加入了新的枚舉類型,則編譯器會發(fā)出警告提示開發(fā)者switch未處理所有枚舉信息狞洋,提示新加入的枚舉未在switch中進行處理弯淘,如果加上default分之的話就不會有該判斷
選項
定義選項的時候。若這些選項可以彼此組合吉懊,則更應(yīng)如此庐橙。只要枚舉定義得對,各選項之間就可通過“按位或操作符”(bitwise OR operator)來組合借嗽。例如态鳖,iOS UI框架中有如下枚舉類型,用來表示某個視圖應(yīng)該如何在水平或垂直方向上調(diào)整大小恶导。
位移枚舉(可復選的枚舉) 使用位移實現(xiàn)選項變量
使用枚舉定義選項,每個選項均可啟用或禁用浆竭,使用上述方式來定義枚舉值,每個枚舉值所對應(yīng)的二進制表示中,只有1個二進制位的值是1惨寿。用“按位或操作符”可組合多個選項邦泄。用 | 來隔開
首先來補充下位運算的知識吧 _
- 1、按位與"&"
只有對應(yīng)的兩個二進位均為1時裂垦,結(jié)果位才為1,否則為0>比如9&5蕉拢,其實就是1001&0101=0001,因此9&5=1>二進制中晕换,與1相&就保持原位午乓,與0相&就為0
- 2闸准、按位或"|"
只要對應(yīng)的二個二進位有一個為1時,結(jié)果位就為1恕汇,否則為0或辖。>比如9|5,其實就是1001|0101=1101颂暇,因此9|5=13
- 3、左移<<
把整數(shù)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(@"右");
}
}
于是,調(diào)用的時候我們通常這么寫
ActionType type = ActionTypeUp | ActionTypeLeft | ActionTypeRight | ActionTypeDown; // 15
[self action:type];
- 定義這個actionType的選項為四個斩狱,這里按位異或,0001|0010|0100|1000=1111所踊,得到結(jié)果這個type為15泌枪。
- 調(diào)用方法
[self action:type]
,進行按位與操作:type & ActionTypeUp
秕岛,1111&0001=0001碌燕,得到這個是否選擇了該選項。然后便可以進行判斷了继薛。