iOS開發中枚舉也是常常會用到的數據類型之一。最近在整理別人寫的老項目的時候,發現枚舉的定義使用了多種方式。數組
typedef enum { MJPropertyKeyTypeDictionary = 0, // 字典的key MJPropertyKeyTypeArray // 數組的key } MJPropertyKeyType;
typedef enum: NSInteger { None, Melee, Fire, Ice, Posion }AttackType;
typedef NS_ENUM(NSUInteger, MeiziCategory) { MeiziCategoryAll = 0, MeiziCategoryDaXiong, MeiziCategoryQiaoTun, MeiziCategoryHeisi, MeiziCategoryMeiTui, MeiziCategoryQingXin, MeiziCategoryZaHui };
這種比較特殊支持位操做。框架
typedef NS_OPTIONS(NSUInteger, ActionType) { ActionTypeUp = 1 << 0, // 1 ActionTypeDown = 1 << 1, // 2 ActionTypeRight = 1 << 2, // 4 ActionTypeLeft = 1 << 3, // 8 };
針對於前三種方式,咱們應該使用那一種更新好呢?
這是來自Stack Overflow的解釋。ide
First, NS_ENUM uses a new feature of the C language where you can specify the underlying type for an enum. In this case, the underlying type for the enum is NSInteger (in plain C it would be whatever the compiler decides, char, short, or even a 24 bit integer if the compiler feels like it).Second, the compiler specifically recognises the NS_ENUM macro, so it knows that you have an enum with values that shouldn't be combined like flags, the debugger knows what's going on, and the enum can be translated to Swift automatically.ui
翻譯:this
首先,NS_ENUM使用C語言的一個新特性,您能夠在該特性中指定enum的底層類型。在本例中,enum的底層類型是NSInteger(在普通的C語言中,它是編譯器決定的任何類型,char、short,甚至是編譯器喜歡的24位整數)。其次,編譯器專門識別NS_ENUM宏,所以它知道您有一個enum,它的值不該該像標誌那樣組合在一塊兒,調試器知道發生了什麼,而且enum能夠自動轉換爲Swift。翻譯
從解釋能夠看出,定義普通的枚舉時,推薦咱們使用第三種方式 NS_ENUM()
,定義位移相關的枚舉時,咱們則使用 NS_OPTIONS()
。debug
並且咱們查看蘋果的框架,發現蘋果使用的也是第三種和第四種。蘋果的官方文檔也有明確的說明,推薦咱們使用NS_ENUM()
和 NS_OPTIONS()
。調試
總結:結合Stack Overflow和蘋果官方的說明,咱們之後在定義枚舉時,應該使用NS_ENUM()
和 NS_OPTIONS()
,這樣更規範。code