1.第一种枚举
typedef enum
{
XUDemoTypeTop,
XUDemoTypeBottom
}XUDemoType;
2.第二种枚举 定义类型
typedef NS_ENUM(NSInteger,XUType)
{
XUTypeTop,
XUTypeBottom,
};
3.第三种枚举 位移枚举
- 如果枚举使用了位运算那么就是位移枚举 ,可以使用或运算传递多个位移枚举给一个参数
- 如果是位移枚举,观察第一个枚举值,如果该枚举值!=0 那么可以默认传0做参数,如果传0做参数,那么效率最高
看如下代码:
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
为什么使用或就能传进去?苹果又是怎么拿到我们传进去的那些枚举呢?
下面我们模仿苹果实现,定义如下位移枚举:
typedef enum {
// MJOptionsNone = 0, // 0b0000
MJOptionsOne = 1<<0, // 0b0001
MJOptionsTwo = 1<<1, // 0b0010
MJOptionsThree = 1<<2, // 0b0100
MJOptionsFour = 1<<3 // 0b1000
} MJOptions;
位移枚举只占用一位,所以我们把位移枚举进行或运算( | )的时候就能拿到每一位的值;
0b0001
0b0010
0b1000 或运算
------
0b1011
拿到每一位的值之后再和相应的枚举进行与运算( & )就能取出某一位的值:
0b1011
0b0100 与运算
------
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");
}
}
所以通过位移枚举的或、与运算就能拿到多个枚举值,系统的也是这样实现的,就不进去看了。