開發中使用枚舉的目的——爲了增長代碼的可讀性markdown
NS_ENUM、NS_OPTIONS 這二者在本質上並無差異,都是用於定義枚舉類型。但在使用中,NS_ENUM多用於通常枚舉,而NS_OPTIONS則多用於帶有移位運算的枚舉。atom
在類的.h文件中,在interface和import之間。spa
一. NS_ENUM,定義狀態等普通枚舉code
typedef NS_ENUM(NSUInteger, myKeyBoardType) {
KeyBoardTypeDefault = 0,
KeyBoardTypeNumber,
KeyBoardTypeEmail
};
····
// myKeyBoardType爲枚舉命名,對應於某個屬性
@property(nonatomic,assign)NSUInteger myKeyBoardType;
複製代碼
狀態枚舉,不能共存,只能存在枚舉值的其中一個。orm
二. NS_OPTIONS,定義選項 枚舉的定義還支持 位運算的方式定義ci
typedef NS_OPTIONS(NSUInteger, TTGDirection) {
TTGDirectionNone = 0,
TTGDirectionTop = 1 << 0, //2 2 10 轉換成 10進制 2
TTGDirectionLeft = 1 << 1, //4 3 100 轉換成 10進制 4
TTGDirectionRight = 1 << 2, //8 4 1000 轉換成 10進制 8
TTGDirectionBottom = 1 << 3 //16 5 10000 轉換成 10進制 16
};
複製代碼
這裏的選項是用位運算的方式定義的,選項枚舉中各值能夠同時存在。開發
應用場景:一個枚舉變量可能要表明多個枚舉值的時候it
其實給一個枚舉變量賦予多個枚舉值的時候,原理只是把各個枚舉值加起來罷了。當加起來之後,就獲取了一個新的值,那麼爲了保證這個值的惟一性,這個時候就體現了位運算的重要做用。位運算能夠確保枚舉值組合的惟一性。 由於位運算的計算方式是將二進制轉換成十進制,也就是說,枚舉值裏面存取的是 計算後的十進制值。打個比方: 經過上面的位運算方式設定好枚舉之後,打印出來的枚舉值分別是: 1 2 4 8 16 這5個數字,不管你如何組合在一塊兒,也不會產生兩個一樣的數字。io
###使用 在須要的地方導入類文件,table
外界對屬性myKeyBoardType進行賦值時,會直接提示枚舉中的選項。
結合switch case 結構使用
typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
MKButtonEdgeInsetsStyleTop, // image在上,label在下
MKButtonEdgeInsetsStyleLeft, // image在左,label在右
MKButtonEdgeInsetsStyleBottom, // image在下,label在上
MKButtonEdgeInsetsStyleRight // image在右,label在左
};
@interface UIButton (ImageTitleSpacing)
@end
複製代碼
//用「或」運算同時賦值多個選項
TTGDirection direction = TTGDirectionTop | TTGDirectionLeft | TTGDirectionBottom;
//用「與」運算取出對應位
if (direction & TTGDirectionTop) {
NSLog(@"top");
}
if (direction & TTGDirectionLeft) {
NSLog(@"left");
}
if (direction & TTGDirectionRight) {
NSLog(@"right");
}
if (direction & TTGDirectionBottom) {
NSLog(@"bottom");
複製代碼