enum 枚舉是一種常量的命名方式,命名出來(lái)的代碼易讀懂。編譯器會(huì)為枚舉分配一個(gè)獨(dú)有的編號(hào),從 0 開(kāi)始,每個(gè)枚舉會(huì)遞增1。
1、表示狀態(tài)
定義語(yǔ)法:
enum CDState{
CDStateON,
CDStateOFF,
};
不過(guò)這每次調(diào)用的時(shí)候就比較凡繁瑣:
enum CDStatestate = CDStateON;
可使用 typedef 關(guān)鍵字來(lái)重新定義枚舉類(lèi)型
定義語(yǔ)法:
enum CDState{
CDStateON,
CDStateOFF,
};
typedef enum CDState CDCDState;
重命名后,就可以使用 CDCDState 來(lái)代替定義枚舉的繁瑣類(lèi)型
CDCDState state = CDStateOFF;
定義枚舉的時(shí)候可以定義底層變量的類(lèi)型,可手動(dòng)指定某個(gè)枚舉成員的值,其后面的枚舉就會(huì)順勢(shì)遞增1。
enumCDState:NSInteger{
CDStateON =2,
CDStateOFF,
};
2、表示選項(xiàng)
定義選項(xiàng)的時(shí)候,這些選項(xiàng)可以彼此組合。各選項(xiàng)之間可通過(guò)“按位或”來(lái)組合。例如:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone? ? ? ? ? ? ? ? = 0,
UIViewAutoresizingFlexibleLeftMargin? = 1 << 0,
UIViewAutoresizingFlexibleWidth? ? ? ? = 1 << 1,
UIViewAutoresizingFlexibleRightMargin? = 1 << 2,
UIViewAutoresizingFlexibleTopMargin? ? = 1 << 3,
UIViewAutoresizingFlexibleHeight? ? ? = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
每個(gè)選項(xiàng)都可以啟用或禁用,使用按位或可組合多個(gè)選項(xiàng)。例如:
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
如下圖展示枚舉值二進(jìn)制:

3、表示狀態(tài)
可以把邏輯含義相似的一組狀態(tài)碼放在同一個(gè)枚舉集里面表示。
通常習(xí)慣在 switch 語(yǔ)句中添加 default 。如果使用枚舉定義狀態(tài),最好不要使用 default ,否則會(huì)認(rèn)為在后面又添加了一種狀態(tài),編譯器會(huì)發(fā)出警告信息,提示新加入的狀態(tài)未在 switch 分支中處理。假如再添加default ,就會(huì)處理這個(gè)新的狀態(tài)。從而導(dǎo)致編譯器不發(fā)警告信息。通常要確保 switch 語(yǔ)句能正確處理所有樣式。

總結(jié)
1、使用枚舉表示狀態(tài)機(jī)的狀態(tài)、傳遞給方法的選項(xiàng)和狀態(tài)碼等值,并起易懂的名字。
2、若把傳遞給某個(gè)方法的選項(xiàng)表示為枚舉類(lèi)型。多個(gè)選項(xiàng)可以同時(shí)使用,可以將選項(xiàng)值定義為2的冪,方便通過(guò)按位或操作將其組合起來(lái)。
3、使用 NS_ENUM 和 NS_OPTIONS 宏來(lái)定義枚舉類(lèi)型,并指明其底層數(shù)據(jù)類(lèi)型。確保是開(kāi)發(fā)者所選的底層數(shù)據(jù)類(lèi)型,而不是采用編譯器所選的類(lèi)型
4、處理枚舉類(lèi)型的 switch 語(yǔ)句中不要實(shí)現(xiàn) default 分支。