OC枚舉的三種寫(xiě)法

1.第一種枚舉

typedef enum
{
    XUDemoTypeTop,
    XUDemoTypeBottom
}XUDemoType;

2.第二種枚舉 定義類(lèi)型

typedef NS_ENUM(NSInteger,XUType)
{
    XUTypeTop,
    XUTypeBottom,
};

3.第三種枚舉 位移枚舉

  • 如果枚舉使用了位運(yùn)算那么就是位移枚舉 ,可以使用或運(yùn)算傳遞多個(gè)位移枚舉給一個(gè)參數(shù)
  • 如果是位移枚舉,觀察第一個(gè)枚舉值,如果該枚舉值!=0 那么可以默認(rèn)傳0做參數(shù),如果傳0做參數(shù),那么效率最高

看如下代碼:

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

為什么使用或就能傳進(jìn)去?蘋(píng)果又是怎么拿到我們傳進(jìn)去的那些枚舉呢?

下面我們模仿蘋(píng)果實(shí)現(xiàn),定義如下位移枚舉:

typedef enum {
//    MJOptionsNone = 0,    // 0b0000
    MJOptionsOne = 1<<0,   // 0b0001
    MJOptionsTwo = 1<<1,   // 0b0010
    MJOptionsThree = 1<<2, // 0b0100
    MJOptionsFour = 1<<3   // 0b1000
} MJOptions;

位移枚舉只占用一位,所以我們把位移枚舉進(jìn)行或運(yùn)算( | )的時(shí)候就能拿到每一位的值;

 0b0001
 0b0010
 0b1000 或運(yùn)算
 ------
 0b1011

拿到每一位的值之后再和相應(yīng)的枚舉進(jìn)行與運(yùn)算( & )就能取出某一位的值:

0b1011
0b0100 與運(yùn)算
------
0b0000

代碼如下:

 //[self setOptions: MJOptionsOne + MJOptionsTwo + MJOptionsFour];
  [self setOptions: MJOptionsOne | MJOptionsFour];

- (void)setOptions:(MJOptions)options
{
    if (options & MJOptionsOne) {
        NSLog(@"包含了MJOptionsOne");
    }
    
    if (options & MJOptionsTwo) {
        NSLog(@"包含了MJOptionsTwo");
    }
    
    if (options & MJOptionsThree) {
        NSLog(@"包含了MJOptionsThree");
    }
    
    if (options & MJOptionsFour) {
        NSLog(@"包含了MJOptionsFour");
    }
}

所以通過(guò)位移枚舉的或、與運(yùn)算就能拿到多個(gè)枚舉值,系統(tǒng)的也是這樣實(shí)現(xiàn)的,就不進(jìn)去看了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容