枚舉(enum)
枚舉(enum)只是一種常量的命名方式。是C語言中的一種基本數(shù)據(jù)類型,是一個"被命名的整型常量"的集合捐寥。
規(guī)范的定義代碼中的狀態(tài)笤昨、選項等“常量”。
不參與內(nèi)存的占用和釋放握恳。
在開發(fā)中使用枚舉的目的,是為了增加代碼的可讀性瞒窒。
用 NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型,并指明其底層數(shù)據(jù)類型乡洼。
-
NS_ENUM
NS_ENUM一般用來定義默認的枚舉值
/* NS_ENUM supports the use of one or two arguments. The first argument is always the integer type used for the values of the enum. The second argument is an optional type name for the macro. When specifying a type name, you must precede the macro with 'typedef' like so:
typedef NS_ENUM(NSInteger, NSComparisonResult) {
...
};
If you do not specify a type name, do not use 'typedef'. For example:
NS_ENUM(NSInteger) {
...
};
*/
#define NS_ENUM(...) CF_ENUM(__VA_ARGS__)
-
NS_OPTIONS
NS_OPTIONS一般用來定義位移相關(guān)操作的枚舉值
#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)
枚舉(Enum)與狀態(tài)(states)
某個對象所經(jīng)歷的各種狀態(tài)可以定義為一個的枚舉集(enumeration set)
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
編譯器會為每個枚舉值分配一個獨有的編號崇裁,從0開始,依次加1束昵。
一個字節(jié)最多可表示0~255共256種(2^8)枚舉變量拔稳。
枚舉(enum)與選項(options)
在定義選項的時候,應(yīng)該使用枚舉類型锹雏。若這些選項可以彼此組合巴比,則更應(yīng)如此。只要枚舉定義得對礁遵,各選項之間就可以通過 “按位或操作符”來組合轻绞。
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
};
- 選項是用位運算的方式定義的
UIViewAutoresizingNone 0 0 0 0 0 0 0 0
UIViewAutoresizingFlexibleLeftMargin 0 0 0 0 0 0 0 1
UIViewAutoresizingFlexibleWidth 0 0 0 0 0 0 1 0
UIViewAutoresizingFlexibleRightMargin 0 0 0 0 0 1 0 0
UIViewAutoresizingFlexibleTopMargin 0 0 0 0 1 0 0 0
UIViewAutoresizingFlexibleHeight 0 0 0 1 0 0 0 0
UIViewAutoresizingFlexibleBottomMargin 0 0 1 0 0 0 0 0
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
0 0 0 1 0 0 1 0
-
<<帶符號左移 (n<<2 將整型值帶符號左移2位 )
將一個運算符對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)
操作數(shù)每左移一位佣耐,相當(dāng)于該數(shù)乘以2
例如:3<<2 后政勃,結(jié)果為12
3的二進制位11,左移兩位后兼砖,右邊補2個0就是1100稼病。1100轉(zhuǎn)為10進制為12选侨。左移操作就相當(dāng)于2的2次方×3。 每左移1位次方就增1
-
>>帶符號右移 (n>>2 將整型值帶符號右移2位 )
將一個數(shù)的各二進制位全部右移若干位然走,正數(shù)左補0援制,負數(shù)左補1,右邊丟棄芍瑞。
操作數(shù)每右移一位晨仑,相當(dāng)于該數(shù)除以2 ,然后取整
例如:9>>1 后,結(jié)果為4
9的二進制為1001拆檬,右移1位后洪己,左正數(shù)補0,右邊丟棄竟贯。結(jié)果為 0100答捕。轉(zhuǎn)為10進制后為4。
枚舉(enum)與狀態(tài)碼(codes)
枚舉用法也可用于 switch 語句屑那。在處理枚舉類型的switch語句中不要實現(xiàn)default分支拱镐。
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected
};
switch (_currentState) {
EOCConnectionStateDisconnected:
//...
break;
EOCConnectionStateConnecting:
//...
break;
EOCConnectionStateConnected:
//...
break;
}
要點:
應(yīng)該用枚舉表示狀態(tài)機的狀態(tài)、傳遞給方法的選項以及狀態(tài)碼等值持际,給這些值起個易懂的名字沃琅,就像監(jiān)聽網(wǎng)絡(luò)狀態(tài)的枚舉。
如果把傳遞給某個方法的選項表示為枚舉類型蜘欲,而多個選項又可同時使用益眉,那么就將各選項定義為2的冪,以便通過按位或操作將其組合起來姥份。
用 NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型郭脂,并指明其底層數(shù)據(jù)類型。這樣可以確保枚舉是用開發(fā)者所選的底層數(shù)據(jù)類型實現(xiàn)出來的澈歉,而不會采用編譯器所選的類型朱庆。
在處理枚舉類型的switch語句中不要實現(xiàn)default分支。這樣的話闷祥,加入新枚舉之后娱颊,編譯器就會提示開發(fā)者:switch語句并未處理所有枚舉。