NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionNone = 0, //值為0
UISwipeGestureRecognizerDirectionRight = 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è)為枚舉類(lèi)型涮阔,自己定義,大括號(hào)中枚舉項(xiàng)必須全部包含小括號(hào)的枚舉類(lèi)型灰殴,枚舉項(xiàng)后面再跟上幾個(gè)值的區(qū)別敬特,這里枚舉項(xiàng)是NSUInteger類(lèi)型,它的值我已經(jīng)標(biāo)記了牺陶,看上面注釋?zhuān)?dāng)然也可以像下方這樣寫(xiě)枚舉伟阔,但是官方推薦格式為上面那種。
typedef enum {
UISwipeGestureRecognizerDirectionNone = 0, //值為0
UISwipeGestureRecognizerDirectionRight = 1 << 0, //值為2的0次方
UISwipeGestureRecognizerDirectionLeft = 1 << 1, //值為2的1次方
UISwipeGestureRecognizerDirectionUp = 1 << 2, //值為2的2次方
UISwipeGestureRecognizerDirectionDown = 1 << 3 //值為2的3次方
}UISwipeGestureRecognizerDirection;
NS_ENUM
typedef NS_ENUM(NSInteger, NSWritingDirection) {
NSWritingDirectionNatural = -1, //值為-1
NSWritingDirectionLeftToRight = 0, //值為0
NSWritingDirectionRightToLeft = 1 //值為1
};
小括號(hào)中第一個(gè)為NSInteger這個(gè)為固定值掰伸,第二個(gè)為枚舉類(lèi)型皱炉,自己定義,大括號(hào)中枚舉項(xiàng)必須包含小括號(hào)中自己定義的枚舉類(lèi)型狮鸭,枚舉項(xiàng)自己加后綴以視區(qū)別合搅,大括號(hào)中的枚舉項(xiàng)的值可自定義,若是定義了枚舉項(xiàng)其中一項(xiàng)的值后面依次在它的前一項(xiàng)的值上加1怕篷,如這樣:
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)然也可以下方這樣寫(xiě)枚舉梳猪,但是官方不推薦,還是上面格式規(guī)范
typedef enum {
NSWritingDirectionNatural = -1, //值為-1
NSWritingDirectionLeftToRight = 0, //值為0
NSWritingDirectionRightToLeft = 1 //值為1
}NSWritingDirection;
NS_ENUM與NS_OPTIONS區(qū)別
- NS_ENUM枚舉項(xiàng)的值為NSInteger蒸痹,NS_OPTIONS枚舉項(xiàng)的值為NSUInteger春弥;
這里為什么NS_ENUM用NSInteger,NS_OPTIONS用NSUInteger看后面總結(jié)叠荠。
- NS_ENUM定義通用枚舉匿沛,NS_OPTIONS定義位移枚舉
位移枚舉即是在你需要的地方可以同時(shí)存在多個(gè)枚舉值如這樣:
UISwipeGestureRecognizer *swipeGR = [[UISwipeGestureRecognizer alloc] init];
swipeGR.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
//這里幾個(gè)枚舉項(xiàng)同時(shí)存在表示它的方向同時(shí)包含1.向下2.向左3.向右
而NS_ENUM定義的枚舉不能幾個(gè)枚舉項(xiàng)同時(shí)存在,只能選擇其中一項(xiàng)榛鼎,像這樣:
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural;
- NS_OPTIONS的枚舉項(xiàng)的值需要像這樣表示1 << 0逃呼,1 << 1鳖孤,2的幾次方這樣,而NS_ENUM可以直接給像1抡笼,2苏揣,3這樣。
總結(jié):
這里為什么會(huì)出現(xiàn)NS_OPTIONS與NS_ENUM且為什么不直接一個(gè)就行推姻,且枚舉值可多選平匈。因?yàn)橛袀€(gè)是否將代碼按照C++模式編譯,若是不按照C++模式編譯藏古,NS_OPTIONS與NS_ENUM展開(kāi)方式就一樣增炭,若是要按照C++模式編譯,就不同了拧晕。在使用或運(yùn)算操作兩個(gè)枚舉值時(shí)隙姿,C++默認(rèn)為運(yùn)算結(jié)果的數(shù)據(jù)類(lèi)型是枚舉的底層數(shù)據(jù)類(lèi)型即NSUInteger,且C++不允許它隱式轉(zhuǎn)換為枚舉類(lèi)型本身,所以C++模式下定義了NS_OPTIONS宏以保證不出現(xiàn)類(lèi)型轉(zhuǎn)換防症。
到了這我們就知道了只要枚舉值需要用到按位或(2個(gè)及以上枚舉值可多個(gè)存在)就使用NS_OPTIONS孟辑,否則使用NS_ENUM。