iOS之枚舉用法

enum.png

枚舉是C語(yǔ)言中的一種基本數(shù)據(jù)類型,是一個(gè)"被命名的整型常量"的集合,它不參與內(nèi)存的占用和釋放,我們?cè)陂_發(fā)中使用枚舉的目的只有一個(gè),那就是為了增加代碼的可讀性

舉個(gè)例子,我們想要在開發(fā)中根據(jù)四季的變化做不同的操作,我們首先想到的可能會(huì)是定義一個(gè)int型變量,通過(guò)為該變量賦不同的值來(lái)表示四季(e.g. 1為春天,2為夏天,3為秋天,4為冬天).但是,對(duì)于閱讀該份代碼的人來(lái)講,他們并不能在短時(shí)間內(nèi)就明白數(shù)字1234所代表的具體含義.這個(gè)時(shí)候,選擇使用枚舉則可以應(yīng)對(duì)該需求

C語(yǔ)言中的枚舉

在C語(yǔ)言中定義枚舉類型的方式如下

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;

注: 該枚舉名稱可以省略,直接定義枚舉變量即可(稱作"匿名枚舉")

通過(guò)typedef為枚舉類型設(shè)置一個(gè)"別名",這樣便可以像使用int一樣使用枚舉類型

typedef enum _Test
{
    TestA = 0,
    TestB,
    TestC,
    TestD
} Test;

定義"別名"后,便可采用如下方式定義枚舉變量

Test test = TestB;

針對(duì)匿名枚舉,在通過(guò)typedef設(shè)置"別名"便變成如下形式

typedef enum
{
    TestA = 0,
    TestB,
    TestC,
    TestD
} Test;

定義"別名"后,便可采用如下方式定義枚舉變量

Test test = TestB;

OC語(yǔ)言中的枚舉

在Objective-C語(yǔ)言中,Apple在iOS6中引入了兩個(gè)宏來(lái)重新定義枚舉類型(即:NS_ENUM與NS_OPTIONS),這兩者在本質(zhì)上并沒(méi)有差別,都是用于定義枚舉類型,但是在使用中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");
}

參考

  1. iOS 關(guān)于枚舉的使用
  2. iOS: 枚舉類型 enum,NS_ENUM,NS_OPTIONS
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芳誓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芥玉,更是在濱河造成了極大的恐慌,老刑警劉巖备图,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灿巧,死亡現(xiàn)場(chǎng)離奇詭異赶袄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抠藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門饿肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盾似,你說(shuō)我怎么就攤上這事敬辣。” “怎么了零院?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵溉跃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我告抄,道長(zhǎng)撰茎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任玄妈,我火速辦了婚禮乾吻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拟蜻。我一直安慰自己绎签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布酝锅。 她就那樣靜靜地躺著诡必,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搔扁。 梳的紋絲不亂的頭發(fā)上爸舒,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音稿蹲,去河邊找鬼扭勉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苛聘,可吹牛的內(nèi)容都是我干的涂炎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼设哗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唱捣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起网梢,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤震缭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后战虏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拣宰,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡党涕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巡社。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣鼓。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖重贺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情回懦,我是刑警寧澤气笙,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站怯晕,受9級(jí)特大地震影響潜圃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舟茶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一谭期、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吧凉,春花似錦隧出、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饲鄙,卻和暖如春凄诞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忍级。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工帆谍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轴咱。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓汛蝙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗦玖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子患雇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容