枚舉NS_OPTIONS與NS_ENUM的區(qū)別與寫法

第一種: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)會解決心中的疑惑。

總結:學習,寫作,激勵,努力。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容