在日常开发中,枚举的使用可以提升我们的代码易读性,一般枚举的几个写法,我在此整理一下,梳理梳理自己的思路,如果有理解有误的地方,希望各位不吝赐教。
首先,为了区分用途,枚举被分为两类: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
这样,就能知道使用的多选选项有哪些。
