由于Objective-C基于C語(yǔ)言,所以C語(yǔ)言有的功能它都有。其中之一就是枚舉類(lèi)型:enum。系統(tǒng)框架中頻繁用到此類(lèi)型,然而開(kāi)發(fā)者容易忽視它。在以一系列常量來(lái)表示錯(cuò)誤狀態(tài)碼或可組合的選項(xiàng)時(shí),極宜使用枚舉為其命名。由于C++11標(biāo)準(zhǔn)擴(kuò)充了枚舉的特性,所以最新版系統(tǒng)框架使用了"強(qiáng)類(lèi)型"(strong type)的枚舉。沒(méi)錯(cuò),Objective-C也能得益于C++11標(biāo)準(zhǔn)。
枚舉只是一種常量命名方式。某個(gè)對(duì)象所經(jīng)歷的各種狀態(tài)就可以定義為一個(gè)簡(jiǎn)單的枚舉集(enmueration set)。比如說(shuō),可以用下列枚舉表示"套接字連接"(socket connection)的狀態(tài):
enum EOCConnectionState {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
由于每種狀態(tài)都用一個(gè)便于理解的值來(lái)表示,所以這樣寫(xiě)出來(lái)的代碼更易讀懂。編譯器會(huì)為枚舉分配一個(gè)獨(dú)有的編號(hào),從0開(kāi)始,每個(gè)枚舉遞增1.實(shí)現(xiàn)枚舉所用的數(shù)據(jù)類(lèi)型取決于編譯器,不過(guò)其二進(jìn)制位(bit)的個(gè)數(shù)必須能完全表示下枚舉編號(hào)才行。在前例中,由于最大編號(hào)是2,所以使用1個(gè)字節(jié)的char類(lèi)型即可。
然而定義枚舉變量的方式卻不太簡(jiǎn)潔,要依如下語(yǔ)法編寫(xiě):
emu EOCConnectionState state = EOCConnectionStateDisconnected;
若是每次不用敲入enum而只需要寫(xiě)EOCConnectionState就好了。要想這樣做則需使用typedef關(guān)鍵字重新定義枚舉類(lèi)型:
enum EOCConnectionState {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
typedef enum EOCConnectionState EOCConnectionState;
現(xiàn)在可以用簡(jiǎn)寫(xiě)的EOCConnectionState來(lái)代替完整的enum EOCConnectionState了;
EOCConnectionState state = EOCConnectionStateDisconnected;
還可以不使用編譯器所分配的序號(hào),而是手工指定某個(gè)枚舉成員所對(duì)應(yīng)的值。語(yǔ)法如下:
enum EOCConnectionState {
EOCConnectionStateDisconnected = 1,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
};
上述代碼把EOCConnectionStateDisconnected的值設(shè)為1,而不使用編譯器所分配的0.如前所述,接下來(lái)幾個(gè)枚舉的值都會(huì)在上一個(gè)基礎(chǔ)上遞增1.如果說(shuō)EOCConnectionStateConnected的值就是3。
還有一種情況應(yīng)該使用枚舉類(lèi)型,那就是定義選項(xiàng)的時(shí)候。若這些選項(xiàng)可以彼此組合,則更應(yīng)如此。只要枚舉定義的對(duì),各選項(xiàng)之間就可通過(guò)"按位或操作符"(bitwise OR operator)來(lái)組合。
在處理枚舉類(lèi)型的switch語(yǔ)句中不要實(shí)現(xiàn)default分支。這樣的話,加入新枚舉之后,編譯器就會(huì)提示開(kāi)發(fā)者:switch語(yǔ)句并未處理所有枚舉。