前言
Enum,也就是枚舉,從C語言開始就有了,C++、Java、Objective-C、Swift這些語言,當然都有對應的枚舉類型,功能可能有多有少,但是最核心的還是一個—規范的定義代碼中的狀態、選項等“常量”。
舉個例子,我們想要在開發中根據四季的變化做不同的操作,我們首先想到的可能會是定義一個int型變量,通過為該變量賦不同的值來表示四季(e.g. 1為春天,2為夏天,3為秋天,4為冬天).但是,對於閱讀該份代碼的人來講,他們並不能在短時間內就明白數字1234所代表的具體含義.這個時候,選擇使用枚舉則可以應對該需求
C語言中的枚舉
在C語言中定義枚舉類型的方式如下
enum 枚舉名稱 { 標識符 = 整型常量, 標識符 = 整型常量, 標識符 = 整型常量, 標識符 = 整型常量 };
以"定義一個枚舉名稱為Test,擁有TestA、TestB等枚舉成員的枚舉類型"為例,定義方式如下
enum Test { TestA = 0, TestB = 1, TestC = 2, TestD = 3 };
注1: 當枚舉成員都未設置"=整型常量"時,默認從第一個標識符開始,從0依次遞增加1
注2: 當為某個枚舉成員設置"=整型常量"時,其後面的標識符會在此基礎上依次遞增加1
在使用該枚舉類型時,我們需要創建一個枚舉變量
enum 枚舉名稱 枚舉變量 = 枚舉變量值;
以"創建一個枚舉名稱為Test的枚舉變量test,並為其賦值TestB"為例
enum Test test = TestB;
注: 枚舉變量值的取值只能從對應枚舉類型的枚舉成員中選擇
我們也可以在定義枚舉類型的同時定義枚舉變量,該枚舉變量不用初始化,可直接對其進行賦值並使用
enum Test { TestA = 0, TestB, TestC, TestD } test;
注: 該枚舉名稱可以省略,直接定義枚舉變量即可(稱作"匿名枚舉")
通過typedef為枚舉類型設置一個"別名",這樣便可以像使用int一樣使用枚舉類型
typedef enum _Test { TestA = 0, TestB, TestC, TestD } Test;
定義"別名"後,便可采用如下方式定義枚舉變量
Test test = TestB;
針對匿名枚舉,在通過typedef設置"別名"便變成如下形式
typedef enum { TestA = 0, TestB, TestC, TestD } Test;
定義"別名"後,便可采用如下方式定義枚舉變量
Test test = TestB;
OC語言中的枚舉
在Objective-C語言中,Apple在iOS6中引入了兩個宏來重新定義枚舉類型(即:NS_ENUM與NS_OPTIONS),這兩者在本質上並沒有差別,都是用於定義枚舉類型,但是在使用中NS_ENUM多用於一般枚舉,而NS_OPTIONS則多用於帶有移位運算的枚舉
NS_ENUM使用示例
typedef NS_ENUM(NSInteger, Test) { TestA = 0, TestB, TestC, TestD };
NS_OPTIONS使用示例
typedef NS_OPTIONS(NSUInteger, Test) { TestA = 1 << 0, TestB = 1 << 1, TestC = 1 << 2, TestD = 1 << 3 };
typedef NS_OPTIONS(NSUInteger, Test) { TestNone = 0, TestA = 1 << 0, TestB = 1 << 1, TestC = 1 << 2, TestD = 1 << 3 };
帶有移位運算的枚舉多用於同一個枚舉變量可以同時賦值多個枚舉成員的情況,其原理就是將各個枚舉值按位或(|),因為移位運算的枚舉成員可以保證按位或(|)計算之後結果的唯一性,所以每種結果都能反向計算出是由哪幾個枚舉成員按位或(|)而成
以"使用按位或(|)為枚舉變量test同時賦值枚舉成員TestA、TestB與TestC"為例
Test test = TestA | TestB; test |= TestC;
以"使用按位異或(^)為枚舉變量test去掉一個枚舉成員TestC"為例
Test test = TestA | TestB | TestC; test ^= TestC;
注: 如果枚舉變量test本身並未賦值TestC,那麼使用按位異或(^)會為枚舉變量test多賦值一個枚舉成員TestC
以"使用按位與(&)判斷枚舉變量test是否賦值了枚舉成員TestA"為例
Test test = TestA | TestB; if (test & TestA) { NSLog(@"yes"); } else { NSLog(@"no"); }
總結
以上就是這篇文章的全部內容了,希望能對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流。