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)去看了。