关于iOS中的枚举的写法

在日常开发中,枚举的使用可以提升我们的代码易读性,一般枚举的几个写法,我在此整理一下,梳理梳理自己的思路,如果有理解有误的地方,希望各位不吝赐教。

首先,为了区分用途,枚举被分为两类:NS_ENUM , NS_OPTIONS,本质上都是枚举,但是NS_ENUM是用于通用情况,NS_OPTIONS一般用于具有位移操作或者特殊情况。

定义枚举的NS_ENUM,也有两种方法:

iOS6Mac OS 10.8之前,定义枚举如下:

typedef enum : NSUInteger {
    UISwipGestureRecognizerDirectionUp    = 0,
    UISwipGestureRecognizerDirectionLeft  = 1,
    UISwipGestureRecognizerDirectionDown  = 2,
    UISwipGestureRecognizerDirectionRight = 3
} UISwipGestureRecognizerDirection;

iOS6Mac OS 10.8之后,苹果引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。
此时苹果建议的定义枚举的方式如下:

typedef NS_ENUM(NSUInteger, UISwipGestureRecognizerDirection) {
    UISwipGestureRecognizerDirectionUp    = 0,
    UISwipGestureRecognizerDirectionLeft  = 1,
    UISwipGestureRecognizerDirectionDown  = 2,
    UISwipGestureRecognizerDirectionRight = 3
};

NS_ENUM定义的枚举只是用简单的几个数字代表枚举选项,所以不能几个枚举项同时存在,只能选择其中一项。

定义枚举的NS_OPTIONS写法如下:

typedef NS_OPTIONS(NSUInteger, UISwipGestureRecognizerDirection) {
    UISwipGestureRecognizerDirectionUp    = 1 << 0,//代表 1 乘以 2的0次方
    UISwipGestureRecognizerDirectionLeft  = 1 << 1,//代表 1 乘以 2的1次方
    UISwipGestureRecognizerDirectionDown  = 1 << 2,//代表 1 乘以 2的2次方
    UISwipGestureRecognizerDirectionRight = 1 << 3 //代表 1 乘以 2的3次方
};

其中<<号代表左移,就是通过这个运算符,才能实现同时对枚举的多种选择,也就是NS_OPTIONS,具体是如何实现的呢,说来也很简单:
首先,在使用的时候,对于NS_OPTIONS中的每个选项使用"|"(或运算)符号进行分隔:

self.direction = UISwipGestureRecognizerDirectionRight | UISwipGestureRecognizerDirectionLeft;

这样,传入的值就为或运算0B1000|0B0010的结果0B1010,在使用的时候,对于传入的结果与选项一一进行与运算,如果包含就大于0,反之,等于0:

`0B1010`&`0B0001` = `0B0000` = 0,不包含UISwipGestureRecognizerDirectionUp
`0B1010`&`0B0010` = `0B0010` > 0,包含UISwipGestureRecognizerDirectionLeft
`0B1010`&`0B0100` = `0B0000` = 0,不包含UISwipGestureRecognizerDirectionDown
`0B1010`&`0B1000` = `0B1000` > 0,包含UISwipGestureRecognizerDirectionRight

这样,就能知道使用的多选选项有哪些。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容