在日常开发中,枚举的使用可以提升我们的代码易读性,一般枚举的几个写法,我在此整理一下,梳理梳理自己的思路,如果有理解有误的地方,希望各位不吝赐教。
首先,为了区分用途,枚举被分为两类:NS_ENUM
, NS_OPTIONS
,本质上都是枚举,但是NS_ENUM
是用于通用情况,NS_OPTIONS
一般用于具有位移操作或者特殊情况。
定义枚举的NS_ENUM
,也有两种方法:
在iOS6
和Mac OS 10.8
之前,定义枚举如下:
typedef enum : NSUInteger {
UISwipGestureRecognizerDirectionUp = 0,
UISwipGestureRecognizerDirectionLeft = 1,
UISwipGestureRecognizerDirectionDown = 2,
UISwipGestureRecognizerDirectionRight = 3
} UISwipGestureRecognizerDirection;
在iOS6
和Mac 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
这样,就能知道使用的多选选项有哪些。