NS_ENUM
和NS_OPTIONS
提供了簡潔的枚舉類型變量的定義方法慢叨。這兩個方法定義了枚舉變量的數(shù)據(jù)類型和名稱寻定,并且告訴系統(tǒng)所占用的空間大小。在舊的編譯器上能夠被正常編譯,在新的編譯器上能定義基本數(shù)據(jù)類型晕翠。
NS_ENUM
用來定義互斥的枚舉值嘹朗,如:
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
NS_OPTIONS
用來定義互相包含的位移操作相關(guān)的枚舉值截酷,如:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
這兩個宏的定義在Foundation.framework的NSObjCRuntime.h中:
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
#if (__cplusplus)
#define NS_OPTIONS(_type, _name) _type _name; enum : _type
#else
#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
#endif
#else
#define NS_ENUM(_type, _name) _type _name; enum
#define NS_OPTIONS(_type, _name) _type _name; enum
#endif
將
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
展開得到:
typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;
enum UIViewAnimationTransition : NSInteger {
從枚舉定義來看势篡,NS_ENUM和NS_OPTIONS本質(zhì)是一樣的,僅僅從字面上來區(qū)分其用途耳幢。NS_ENUM是通用情況岸晦,NS_OPTIONS一般用來定義具有位移操作或特點的情況(bitmask)。
實際使用時睛藻,可以直接定義:
typedef enum : NSInteger {....} UIViewAnimationTransition;
等效于上述定義启上。