標籤:約束 tail 文檔 view repr 簡單 and get lock
在蘋果的一篇官方文檔《Adopting Modern Objective-C》“適應現代的Objectice-c”中提及到使用NS_ENUM和NS_OPTIONS來聲明枚舉
NS_ENUM用來聲明基於一般整形的枚舉,而NS_OPTIONS一般用來聲明基於位元遮罩的聲明(bitmask)
在一般的教程書中也經常提及,但是其中的區別是什麼呢?
在NSObjCRuntime.h中有如下的宏定義
[cpp] view plain copy
- #define NS_ENUM(_type, _name) CF_ENUM(_type, _name)
[cpp] view plain copy
- #define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)
就是說,NS_ENUM 、CF_ENUM是一樣的,NS_OPTIONS、CF_OPTIONS是一樣的
那再具體分析下CF_ENUM,CF_OPTIONS宏到底是什麼東西
在CF_ENUM,CF_OPTIONS宏定義標頭檔CFAvailability.h中有如下的宏定義
[cpp] view plain copy
- #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
- #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
- #if (__cplusplus)
- #define CF_OPTIONS(_type, _name) _type _name; enum : _type
- #else
- #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
- #endif
- #else
- #define CF_ENUM(_type, _name) _type _name; enum
- #define CF_OPTIONS(_type, _name) _type _name; enum
- #endif
詐一看,其實兩者基本思想是沒有區別的,並沒有說NS_ENUM枚舉的元素非得是整型,NS_OPTIONS枚舉的元素非得是與位有關的,據其根本
枚舉的目的是為整型資料添加一個名字罷了。NS_ENUM,NS_OPTIONS只是為了代碼的統一性,約束一下編碼規則罷了。
但是,仔細看的又會發現有不同,為什麼有時候將宏定義為#define CF_OPTIONS(_type, _name) _type _name; enum : _type或者#define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
StackOverflow 裡面這個問題說到,但是前面幾個回答似乎有點簡單,沒有說到重點,最後那個回到似乎很有道理
具體是說因為c++11支援了枚舉的向前聲明(forward declare),因而出現的bug,為相容使用到了類如“CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type”
NS_ENUM 和 NS_OPTIONS的區別