第一種:NS_OPTIONS
typedefNS_OPTIONS(NSUInteger,UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionNone=0,//值為0UISwipeGestureRecognizerDirectionRight=1<<0,//值為2的0次方UISwipeGestureRecognizerDirectionLeft=1<<1,//值為2的1次方UISwipeGestureRecognizerDirectionUp=1<<2,//值為2的2次方UISwipeGestureRecognizerDirectionDown=1<<3//值為2的3次方
};
小括號中第一個為NSUInteger這個為固定值,第二個為枚舉類型,自己定義,大括號中枚舉項必須全部包含小括號的枚舉類型,枚舉項后面再跟上幾個值的區(qū)別,這里枚舉項是NSUInteger類型,當然也可以像下方這樣寫枚舉,但是官方推薦格式為上面那種。
typedef enum{
UISwipeGestureRecognizerDirectionNone=0,//值為0UISwipeGestureRecognizerDirectionRight=1<<0,//值為2的0次方UISwipeGestureRecognizerDirectionLeft=1<<1,//值為2的1次方UISwipeGestureRecognizerDirectionUp=1<<2,//值為2的2次方UISwipeGestureRecognizerDirectionDown=1<<3//值為2的3次方
}UISwipeGestureRecognizerDirection;
我比較喜歡下面的這種寫法,C++里面的習慣吧
第二種:NS_ENUM
小括號中第一個為NSInteger這個為固定值,第二個為枚舉類型,自己定義,大括號中枚舉項必須包含小括號中自己定義的枚舉類型,枚舉項自己加后綴以視區(qū)別,大括號中的枚舉項的值可自定義,若是定義了枚舉項其中一項的值后面依次在它的前一項的值上加1,如這樣:
typedef NS_ENUM(NSInteger,NSWritingDirection) {
NSWritingDirectionNatural=-1,//值為-1? ??
NSWritingDirectionLeftToRight=0,//值為0
NSWritingDirectionRightToLeft=1//值為1? ? ??
?};
跟第一種基本格式相同,唯一不同的是小括號里面數字變量的類型,NS_OPTIONS 是NSUInteger 而?NS_ENUM 類型為NSInteger
當然下面還可以這樣寫:
typedef NS_ENUM(NSInteger,NSWritingDirection) {
NSWritingDirectionNatural=0,//值為0? ??
NSWritingDirectionLeftToRight,//值為1
NSWritingDirectionRightToLeft//值為2? ? ??
};
//或者這樣:
typedef ?NS_ENUM(NSInteger,NSWritingDirection) {
NSWritingDirectionNatural=0,//值為0? ?
?NSWritingDirectionLeftToRight=2,//值為2
NSWritingDirectionRightToLeft//值為3? ??
? };//若是都不定義值,默認第一項為0,后面依次枚舉項的值加1。
?當然也可以下方這樣寫枚舉,但是官方不推薦:
typedef enum{
NSWritingDirectionNatural=-1,//值為-1? ??
NSWritingDirectionLeftToRight=0,//值為0
NSWritingDirectionRightToLeft=1//值為1?
?}NSWritingDirection;
第三區(qū)別:NS_ENUM與NS_OPTIONS區(qū)別
NS_ENUM枚舉項的值為NSInteger,NS_OPTIONS枚舉項的值為NSUInteger;
這里為什么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger。(這里為什么會出現NS_OPTIONS與NS_ENUM且為什么不直接一個就行,且枚舉值可多選。因為有個是否將代碼按照C++模式編譯,若是不按照C++模式編譯,NS_OPTIONS與NS_ENUM展開方式就一樣,若是要按照C++模式編譯,就不同了。在使用或運算操作兩個枚舉值時,C++默認為運算結果的數據類型是枚舉的底層數據類型即NSUInteger,且C++不允許它隱式轉換為枚舉類型本身,所以需要用NS_OPTIONS這個宏來定義。這里主要是防止代碼按C++模式編譯。(如果是這個枚舉值只需要使用一個的話,就可以用NS_ENUM定義;像UI那種使用多個枚舉值的,就使用NS_OPTIONS)按位或操作,,與NS_ENUM有所不同,C++不允許“隱式轉換”。
NS_ENUM定義通用枚舉,NS_OPTIONS定義位移枚舉
位移枚舉即是在你需要的地方可以同時存在多個枚舉值 如:
UISwipeGestureRecognizer*swipeRecognizer = [[UISwipeGestureRecognizer alloc] init];?
?swipeRecognizer.direction =UISwipeGestureRecognizerDirectionDown|UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight;//這里幾個枚舉項同時存在表示它的方向同時包含1.向下2.向左3.向右
而NS_ENUM定義的枚舉不能幾個枚舉項同時存在,只能選擇其中一項,如:
NSMutableParagraphStyle*paragraph = [[NSMutableParagraphStylealloc] init];paragraph.baseWritingDirection =NSWritingDirectionNatural;
NS_OPTIONS的枚舉項的值需要像這樣表示1 << 0,1 << 1,2的幾次方這樣,而NS_ENUM可以直接給像1,2,3這樣。為什么要這樣,具體原理可以看這里(http://m.itdecent.cn/p/a3477662425a)會解決心中的疑惑。
總結:學習,寫作,激勵,努力。