詳解枚舉NS_OPTIONS與NS_ENUM的區(qū)別與格式

NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
    UISwipeGestureRecognizerDirectionNone = 0,  //值為0
    UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值為2的0次方
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值為2的1次方
    UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值為2的2次方
    UISwipeGestureRecognizerDirectionDown = 1 << 3  //值為2的3次方
};

小括號(hào)中第一個(gè)為NSUInteger這個(gè)為固定值琐旁,第二個(gè)為枚舉類(lèi)型涮阔,自己定義,大括號(hào)中枚舉項(xiàng)必須全部包含小括號(hào)的枚舉類(lèi)型灰殴,枚舉項(xiàng)后面再跟上幾個(gè)值的區(qū)別敬特,這里枚舉項(xiàng)是NSUInteger類(lèi)型,它的值我已經(jīng)標(biāo)記了牺陶,看上面注釋?zhuān)?dāng)然也可以像下方這樣寫(xiě)枚舉伟阔,但是官方推薦格式為上面那種。

typedef enum {
    UISwipeGestureRecognizerDirectionNone = 0,  //值為0
    UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值為2的0次方
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值為2的1次方
    UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值為2的2次方
    UISwipeGestureRecognizerDirectionDown = 1 << 3  //值為2的3次方
}UISwipeGestureRecognizerDirection;

NS_ENUM

typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = -1,  //值為-1    
    NSWritingDirectionLeftToRight = 0,  //值為0
    NSWritingDirectionRightToLeft = 1  //值為1       
};

小括號(hào)中第一個(gè)為NSInteger這個(gè)為固定值掰伸,第二個(gè)為枚舉類(lèi)型皱炉,自己定義,大括號(hào)中枚舉項(xiàng)必須包含小括號(hào)中自己定義的枚舉類(lèi)型狮鸭,枚舉項(xiàng)自己加后綴以視區(qū)別合搅,大括號(hào)中的枚舉項(xiàng)的值可自定義,若是定義了枚舉項(xiàng)其中一項(xiàng)的值后面依次在它的前一項(xiàng)的值上加1怕篷,如這樣:

typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = 0,  //值為0    
    NSWritingDirectionLeftToRight,  //值為1
    NSWritingDirectionRightToLeft  //值為2       
};
//或者這樣
typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = 0,  //值為0    
    NSWritingDirectionLeftToRight = 2,  //值為2
    NSWritingDirectionRightToLeft  //值為3       
};
//若是都不定義值历筝,默認(rèn)第一項(xiàng)為0,后面依次枚舉項(xiàng)的值加1廊谓。

當(dāng)然也可以下方這樣寫(xiě)枚舉梳猪,但是官方不推薦,還是上面格式規(guī)范

typedef enum {
    NSWritingDirectionNatural = -1,  //值為-1    
    NSWritingDirectionLeftToRight = 0,  //值為0
    NSWritingDirectionRightToLeft = 1  //值為1  
}NSWritingDirection;

NS_ENUM與NS_OPTIONS區(qū)別

  • NS_ENUM枚舉項(xiàng)的值為NSInteger蒸痹,NS_OPTIONS枚舉項(xiàng)的值為NSUInteger春弥;

    這里為什么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger看后面總結(jié)叠荠。

  • NS_ENUM定義通用枚舉匿沛,NS_OPTIONS定義位移枚舉

    位移枚舉即是在你需要的地方可以同時(shí)存在多個(gè)枚舉值如這樣:

  UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
  swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
  //這里幾個(gè)枚舉項(xiàng)同時(shí)存在表示它的方向同時(shí)包含1.向下2.向左3.向右
而NS_ENUM定義的枚舉不能幾個(gè)枚舉項(xiàng)同時(shí)存在,只能選擇其中一項(xiàng)榛鼎,像這樣:
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural;
  • NS_OPTIONS的枚舉項(xiàng)的值需要像這樣表示1 << 0逃呼,1 << 1鳖孤,2的幾次方這樣,而NS_ENUM可以直接給像1抡笼,2苏揣,3這樣。

總結(jié):

這里為什么會(huì)出現(xiàn)NS_OPTIONS與NS_ENUM且為什么不直接一個(gè)就行推姻,且枚舉值可多選平匈。因?yàn)橛袀€(gè)是否將代碼按照C++模式編譯,若是不按照C++模式編譯藏古,NS_OPTIONS與NS_ENUM展開(kāi)方式就一樣增炭,若是要按照C++模式編譯,就不同了拧晕。在使用或運(yùn)算操作兩個(gè)枚舉值時(shí)隙姿,C++默認(rèn)為運(yùn)算結(jié)果的數(shù)據(jù)類(lèi)型是枚舉的底層數(shù)據(jù)類(lèi)型即NSUInteger,且C++不允許它隱式轉(zhuǎn)換為枚舉類(lèi)型本身,所以C++模式下定義了NS_OPTIONS宏以保證不出現(xiàn)類(lèi)型轉(zhuǎn)換防症。
到了這我們就知道了只要枚舉值需要用到按位或(2個(gè)及以上枚舉值可多個(gè)存在)就使用NS_OPTIONS孟辑,否則使用NS_ENUM。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔫敲,一起剝皮案震驚了整個(gè)濱河市饲嗽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈嘿,老刑警劉巖貌虾,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裙犹,居然都是意外死亡尽狠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)叶圃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袄膏,“玉大人,你說(shuō)我怎么就攤上這事掺冠〕凉荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵德崭,是天一觀的道長(zhǎng)斥黑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)眉厨,這世上最難降的妖魔是什么锌奴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮憾股,結(jié)果婚禮上鹿蜀,老公的妹妹穿的比我還像新娘箕慧。我一直安慰自己,他們只是感情好茴恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布销钝。 她就那樣靜靜地躺著,像睡著了一般琐簇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上座享,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天婉商,我揣著相機(jī)與錄音,去河邊找鬼渣叛。 笑死丈秩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淳衙。 我是一名探鬼主播蘑秽,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箫攀!你這毒婦竟也來(lái)了肠牲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤靴跛,失蹤者是張志新(化名)和其女友劉穎缀雳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梢睛,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肥印,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绝葡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深碱。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖藏畅,靈堂內(nèi)的尸體忽然破棺而出敷硅,到底是詐尸還是另有隱情,我是刑警寧澤墓赴,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布竞膳,位于F島的核電站,受9級(jí)特大地震影響诫硕,放射性物質(zhì)發(fā)生泄漏坦辟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一章办、第九天 我趴在偏房一處隱蔽的房頂上張望锉走。 院中可真熱鬧滨彻,春花似錦、人聲如沸挪蹭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梁厉。三九已至辜羊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間词顾,已是汗流浹背八秃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肉盹,地道東北人昔驱。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像上忍,于是被迫代替她去往敵國(guó)和親骤肛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 轉(zhuǎn)載自:http://mp.weixin.qq.com/s?__biz=MzA3NzM0NzkxMQ==&mid=...
    YYT1992閱讀 711評(píng)論 3 0
  • 對(duì)于OC中的枚舉類(lèi)型窍蓝,雖然知道有NS_ENUM和NS_OPTION腋颠,然而并不是十分清楚它們之間的區(qū)別。另外它抱,也很好...
    ePan閱讀 18,354評(píng)論 1 14
  • 說(shuō)明:本篇文章是作者(Mitchell)參考蘋(píng)果的 Adopting Modern Objective-C 這篇文...
    Mitchell閱讀 908評(píng)論 0 3
  • 參考:http://blog.csdn.net/annkie/article/details/9877643 一般...
    GShining閱讀 490評(píng)論 0 0
  • 白的空 夜猩紅 黑木地板起窗風(fēng) 老槐枝擺 殘?jiān)鹿鼞?吱吖梯間夜?fàn)T來(lái) 白床單撕扯著過(guò)往 舊拖鞋糾纏起彷徨 憑空叫囂的...
    海策閱讀 219評(píng)論 0 0