OC枚举的三种写法

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");
    }
}

所以通过位移枚举的或、与运算就能拿到多个枚举值,系统的也是这样实现的,就不进去看了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容