iOS開發(fā)之枚舉用法小結(jié)
前言
Enum,也就是枚舉,從C語言開始就有了,C++、Java、Objective-C、Swift這些語言,當(dāng)然都有對(duì)應(yīng)的枚舉類型,功能可能有多有少,但是最核心的還是一個(gè)—規(guī)范的定義代碼中的狀態(tài)、選項(xiàng)等“常量”。
舉個(gè)例子,我們想要在開發(fā)中根據(jù)四季的變化做不同的操作,我們首先想到的可能會(huì)是定義一個(gè)int型變量,通過為該變量賦不同的值來表示四季(e.g. 1為春天,2為夏天,3為秋天,4為冬天).但是,對(duì)于閱讀該份代碼的人來講,他們并不能在短時(shí)間內(nèi)就明白數(shù)字1234所代表的具體含義.這個(gè)時(shí)候,選擇使用枚舉則可以應(yīng)對(duì)該需求
C語言中的枚舉
在C語言中定義枚舉類型的方式如下
enum 枚舉名稱
{
標(biāo)識(shí)符 = 整型常量,
標(biāo)識(shí)符 = 整型常量,
標(biāo)識(shí)符 = 整型常量,
標(biāo)識(shí)符 = 整型常量
};
以"定義一個(gè)枚舉名稱為Test,擁有TestA、TestB等枚舉成員的枚舉類型"為例,定義方式如下
enum Test
{
TestA = 0,
TestB = 1,
TestC = 2,
TestD = 3
};
注1: 當(dāng)枚舉成員都未設(shè)置"=整型常量"時(shí),默認(rèn)從第一個(gè)標(biāo)識(shí)符開始,從0依次遞增加1
注2: 當(dāng)為某個(gè)枚舉成員設(shè)置"=整型常量"時(shí),其后面的標(biāo)識(shí)符會(huì)在此基礎(chǔ)上依次遞增加1
在使用該枚舉類型時(shí),我們需要?jiǎng)?chuàng)建一個(gè)枚舉變量
enum 枚舉名稱 枚舉變量 = 枚舉變量值;
以"創(chuàng)建一個(gè)枚舉名稱為Test的枚舉變量test,并為其賦值TestB"為例
enum Test test = TestB;
注: 枚舉變量值的取值只能從對(duì)應(yīng)枚舉類型的枚舉成員中選擇
我們也可以在定義枚舉類型的同時(shí)定義枚舉變量,該枚舉變量不用初始化,可直接對(duì)其進(jìn)行賦值并使用
enum Test
{
TestA = 0,
TestB,
TestC,
TestD
} test;
注: 該枚舉名稱可以省略,直接定義枚舉變量即可(稱作"匿名枚舉")
通過typedef為枚舉類型設(shè)置一個(gè)"別名",這樣便可以像使用int一樣使用枚舉類型
typedef enum _Test
{
TestA = 0,
TestB,
TestC,
TestD
} Test;
定義"別名"后,便可采用如下方式定義枚舉變量
Test test = TestB;
針對(duì)匿名枚舉,在通過typedef設(shè)置"別名"便變成如下形式
typedef enum
{
TestA = 0,
TestB,
TestC,
TestD
} Test;
定義"別名"后,便可采用如下方式定義枚舉變量
Test test = TestB;
OC語言中的枚舉
在Objective-C語言中,Apple在iOS6中引入了兩個(gè)宏來重新定義枚舉類型(即:NS_ENUM與NS_OPTIONS),這兩者在本質(zhì)上并沒有差別,都是用于定義枚舉類型,但是在使用中NS_ENUM多用于一般枚舉,而NS_OPTIONS則多用于帶有移位運(yùn)算的枚舉
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
};
帶有移位運(yùn)算的枚舉多用于同一個(gè)枚舉變量可以同時(shí)賦值多個(gè)枚舉成員的情況,其原理就是將各個(gè)枚舉值按位或(|),因?yàn)橐莆贿\(yùn)算的枚舉成員可以保證按位或(|)計(jì)算之后結(jié)果的唯一性,所以每種結(jié)果都能反向計(jì)算出是由哪幾個(gè)枚舉成員按位或(|)而成
以"使用按位或(|)為枚舉變量test同時(shí)賦值枚舉成員TestA、TestB與TestC"為例
Test test = TestA | TestB; test |= TestC;
以"使用按位異或(^)為枚舉變量test去掉一個(gè)枚舉成員TestC"為例
Test test = TestA | TestB | TestC; test ^= TestC;
注: 如果枚舉變量test本身并未賦值TestC,那么使用按位異或(^)會(huì)為枚舉變量test多賦值一個(gè)枚舉成員TestC
以"使用按位與(&)判斷枚舉變量test是否賦值了枚舉成員TestA"為例
Test test = TestA | TestB;
if (test & TestA)
{
NSLog(@"yes");
}
else
{
NSLog(@"no");
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望能對(duì)大家的學(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
iOS中TableView如何統(tǒng)一數(shù)據(jù)源代理詳解
這篇文章主要給大家介紹了關(guān)于iOS中TableView如何統(tǒng)一數(shù)據(jù)源代理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果
這篇文章給大家分享了利用iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果,有需要的朋友們可以參考借鑒。下面來一起看看。2016-09-09
iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別詳解
OS的人臉識(shí)別從iOS 5(2011)就有了,不過一直沒怎么被關(guān)注過。人臉識(shí)別API允許開發(fā)者不僅可以檢測(cè)人臉,也可以檢測(cè)到面部的一些特殊屬性,比如說微笑或眨眼。下面這篇文章主要給大家介紹了iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,需要的朋友可以參考下。2017-05-05
iOS大文件的分片上傳和斷點(diǎn)上傳的實(shí)現(xiàn)代碼
這篇文章主要介紹了iOS大文件的分片上傳和斷點(diǎn)上傳的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-12-12
iOS NSNotificationCenter通知中心使用小結(jié)
IOS中經(jīng)常會(huì)使用到NSNotification和delegate來進(jìn)行一些類之間的消息傳遞,這篇文章主要介紹了iOS NSNotificationCenter使用小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
ios 使用xcode11 新建項(xiàng)目工程的步驟詳解
這篇文章主要介紹了ios 使用xcode11 新建項(xiàng)目工程 (值得注意的問題),本文分步驟通過圖文的形式給大家展示,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

