在日常開發(fā)中,枚舉的使用可以提升我們的代碼易讀性,一般枚舉的幾個寫法,我在此整理一下,梳理梳理自己的思路,如果有理解有誤的地方,希望各位不吝賜教。
首先,為了區(qū)分用途,枚舉被分為兩類: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合二為一,并且采用不同的宏來從代碼角度來區(qū)分。
此時蘋果建議的定義枚舉的方式如下:
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
這樣,就能知道使用的多選選項有哪些。