iOS開發之枚舉用法小結_IOS

來源:互聯網
上載者:User

前言

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");}

總結

以上就是這篇文章的全部內容了,希望能對大家的學習或者工作帶來一定的協助,如果有疑問大家可以留言交流。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.