第一種: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次方
};
小括號(hào)中第一個(gè)為NSUInteger這個(gè)為固定值梧宫,第二個(gè)為枚舉類型接谨,自己定義,大括號(hào)中枚舉項(xiàng)必須全部包含小括號(hào)的枚舉類型塘匣,枚舉項(xiàng)后面再跟上幾個(gè)值的區(qū)別疤坝,這里枚舉項(xiàng)是NSUInteger類型,當(dāng)然也可以像下方這樣寫枚舉馆铁,但是官方推薦格式為上面那種跑揉。
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++里面的習(xí)慣吧
第二種:NS_ENUM
小括號(hào)中第一個(gè)為NSInteger這個(gè)為固定值埠巨,第二個(gè)為枚舉類型历谍,自己定義,大括號(hào)中枚舉項(xiàng)必須包含小括號(hào)中自己定義的枚舉類型辣垒,枚舉項(xiàng)自己加后綴以視區(qū)別望侈,大括號(hào)中的枚舉項(xiàng)的值可自定義,若是定義了枚舉項(xiàng)其中一項(xiàng)的值后面依次在它的前一項(xiàng)的值上加1勋桶,如這樣:
typedef NS_ENUM(NSInteger,NSWritingDirection) {
NSWritingDirectionNatural=-1,//值為-1? ??
NSWritingDirectionLeftToRight=0,//值為0
NSWritingDirectionRightToLeft=1//值為1? ? ??
?};
跟第一種基本格式相同脱衙,唯一不同的是小括號(hào)里面數(shù)字變量的類型侥猬,NS_OPTIONS 是NSUInteger 而?NS_ENUM 類型為NSInteger
當(dāng)然下面還可以這樣寫:
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? ??
? };//若是都不定義值,默認(rèn)第一項(xiàng)為0捐韩,后面依次枚舉項(xiàng)的值加1退唠。
?當(dāng)然也可以下方這樣寫枚舉,但是官方不推薦:
typedef enum{
NSWritingDirectionNatural=-1,//值為-1? ??
NSWritingDirectionLeftToRight=0,//值為0
NSWritingDirectionRightToLeft=1//值為1?
?}NSWritingDirection;
第三區(qū)別:NS_ENUM與NS_OPTIONS區(qū)別
NS_ENUM枚舉項(xiàng)的值為NSInteger荤胁,NS_OPTIONS枚舉項(xiàng)的值為NSUInteger瞧预;
這里為什么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger仅政。(這里為什么會(huì)出現(xiàn)NS_OPTIONS與NS_ENUM且為什么不直接一個(gè)就行垢油,且枚舉值可多選。因?yàn)橛袀€(gè)是否將代碼按照C++模式編譯圆丹,若是不按照C++模式編譯滩愁,NS_OPTIONS與NS_ENUM展開方式就一樣,若是要按照C++模式編譯辫封,就不同了硝枉。在使用或運(yùn)算操作兩個(gè)枚舉值時(shí),C++默認(rèn)為運(yùn)算結(jié)果的數(shù)據(jù)類型是枚舉的底層數(shù)據(jù)類型即NSUInteger,且C++不允許它隱式轉(zhuǎn)換為枚舉類型本身秸讹,所以需要用NS_OPTIONS這個(gè)宏來定義檀咙。這里主要是防止代碼按C++模式編譯雅倒。(如果是這個(gè)枚舉值只需要使用一個(gè)的話璃诀,就可以用NS_ENUM定義;像UI那種使用多個(gè)枚舉值的蔑匣,就使用NS_OPTIONS)按位或操作劣欢,,與NS_ENUM有所不同裁良,C++不允許“隱式轉(zhuǎn)換”凿将。
NS_ENUM定義通用枚舉,NS_OPTIONS定義位移枚舉
位移枚舉即是在你需要的地方可以同時(shí)存在多個(gè)枚舉值 如:
UISwipeGestureRecognizer*swipeRecognizer = [[UISwipeGestureRecognizer alloc] init];?
?swipeRecognizer.direction =UISwipeGestureRecognizerDirectionDown|UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight;//這里幾個(gè)枚舉項(xiàng)同時(shí)存在表示它的方向同時(shí)包含1.向下2.向左3.向右
而NS_ENUM定義的枚舉不能幾個(gè)枚舉項(xiàng)同時(shí)存在价脾,只能選擇其中一項(xiàng)牧抵,如:
NSMutableParagraphStyle*paragraph = [[NSMutableParagraphStylealloc] init];paragraph.baseWritingDirection =NSWritingDirectionNatural;
NS_OPTIONS的枚舉項(xiàng)的值需要像這樣表示1 << 0,1 << 1侨把,2的幾次方這樣犀变,而NS_ENUM可以直接給像1,2秋柄,3這樣获枝。為什么要這樣,具體原理可以看這里(http://www.reibang.com/p/a3477662425a)會(huì)解決心中的疑惑骇笔。
總結(jié):學(xué)習(xí)省店,寫作嚣崭,激勵(lì),努力懦傍。