枚舉值: 它是一個整形(int) ,并且它不參加內(nèi)存的占用和釋放 枚舉定義變量即可直接使用,不用初始化
三種類型的枚舉
enum在iOS6之前一般我們采用C風(fēng)格的enum關(guān)鍵字可以定義枚舉類型
三種寫法:
enum {
A,
B,
C
};
enum Name {
A,
B,
C
};
typedef enum {
A,
B,
C
}Name;
默認(rèn)A=0,B=1剪芍,C=2挟炬,也可自行賦值
在iOS6之后引入兩個宏來定義枚舉實(shí)際上是將enum定義和typedef合二為一劣像,并且采用不同的宏來從代碼角度來區(qū)分塔粒。
NS_ENUM普通枚舉定義可參見UIKit.Framework中
NS_OPTIONS位運(yùn)算及特殊枚舉的定義糖声。什么時候要用到這種方式呢? 那就是一個枚舉變量可能要代表多個枚舉值的時候. 其實(shí)給一個枚舉變量賦予多個枚舉值的時候,原理只是把各個枚舉值加起來罷了. 當(dāng)加起來以后,就獲取了一個新的值,那么為了保證這個值的唯一性,這個時候就體現(xiàn)了位運(yùn)算的重要作用. 位運(yùn)算可以確保枚舉值組合的唯一性. 因?yàn)槲贿\(yùn)算的計算方式是將二進(jìn)制轉(zhuǎn)換成十進(jìn)制,也就是說,枚舉值里面存取的是 計算后的十進(jìn)制值. 打個比方: 通過上面的位運(yùn)算方式設(shè)定好枚舉以后,打印出來的枚舉值分別是: 1 2 4 8 16 這5個數(shù)字,無論你如何組合在一起,也不會產(chǎn)生兩個同樣的數(shù)字.
這兩個宏的定義在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, Age) {
A,
B,
C
};
//"<<"左移 ,">>"右移
typedef NS_OPTIONS(NSInteger, Age) {
A = 1, ? ? ? ? ? ? ? ? ? ? ? ?
B = 1 << 1,
C = 1 << 1,
D = 1 << 1
};
A=1抽莱,B=2(1左移一位)桐筏,C=4(1左移兩位)纸型,D=8(1左移三位),其實(shí)就是將二進(jìn)制000001,進(jìn)行位移操作狰腌,再將二進(jìn)制轉(zhuǎn)換成10進(jìn)制
當(dāng)然枚舉值之間還有“與&”“或|”的操作除破,結(jié)果其實(shí)就是二進(jìn)制數(shù)比對的結(jié)果,不明白的可以看下C中的與琼腔、或說明
左移且A=1的情況下瑰枫,“或”可以理解成兩枚舉值相加:Age age = (A | B);? age = 3,“與”可以理解為是否包含某個值 int x = (age & A),int y = (age & C)丹莲,包含:結(jié)果為被包含的值x=A光坝,不包含:結(jié)果為0,y=0,即為假甥材;有累加,自然有累減,如果減一個不存在的枚舉值, 那么本次累減的枚舉值,會自動累加上去盯另,age ^= C,結(jié)果為age+C的值,如果減的枚舉值存在擂达,則正常相減土铺,age ^= A,結(jié)果為age-A的值