1. 應該用枚舉表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字,就像監聽網路狀態的枚舉。 2. 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那麼就將各選項定義為2的冪,以便通過按位或操作將其組合起來。 3. 用 NS_ENUM 與 NS_O... ...
枚舉(enum)
枚舉(enum)只是一種常量的命名方式。是C語言中的一種基本數據類型,是一個"被命名的整型常量"的集合。
規範的定義代碼中的狀態、選項等“常量”。
不參與記憶體的占用和釋放。
在開發中使用枚舉的目的,是為了增加代碼的可讀性。
用 NS_ENUM
與 NS_OPTIONS
巨集來定義枚舉類型,並指明其底層數據類型。
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
一般用來定義位移相關操作的枚舉值#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)
枚舉(Enum)與狀態(states)
某個對象所經歷的各種狀態可以定義為一個的枚舉集(enumeration set)
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
編譯器會為每個枚舉值分配一個獨有的編號,從
0
開始,依次加1
。一個位元組最多可表示
0~255
共256
種(2^8
)枚舉變數。
枚舉(enum)與選項(options)
在定義選項的時候,應該使用枚舉類型。若這些選項可以彼此組合,則更應如此。只要枚舉定義得對,各選項之間就可以通過 “按位或操作符”來組合。
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
)操作數每左移一位,相當於該數乘以
2
例如:
3<<2
後,結果為12
3
的二進位位11
,左移兩位後,右邊補2個0
就是1100
。1100
轉為10
進位為12
。左移操作就相當於
2
的2
次方×3
。 每左移1
位次方就增1
>>帶符號右移 (
n>>2
將整型值帶符號右移2
位 )將一個數的各二進位位全部右移若幹位,正數左補
0
,負數左補1
,右邊丟棄。操作數每右移一位,相當於該數除以
2
,然後取整例如:
9>>1
後,結果為4
9
的二進位為1001
,右移1
位後,左正數補0
,右邊丟棄。結果為0100
。轉為10
進位後為4
。
枚舉(enum)與狀態碼(codes)
枚舉用法也可用於 switch
語句。在處理枚舉類型的switch
語句中不要實現default
分支。
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected
};
switch (_currentState) {
EOCConnectionStateDisconnected:
//...
break;
EOCConnectionStateConnecting:
//...
break;
EOCConnectionStateConnected:
//...
break;
}
要點
應該用枚舉表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字,就像監聽網路狀態的枚舉。
如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那麼就將各選項定義為2的冪,以便通過按位或操作將其組合起來。
用
NS_ENUM
與NS_OPTIONS
巨集來定義枚舉類型,並指明其底層數據類型。這樣可以確保枚舉是用開發者所選的底層數據類型實現出來的,而不會採用編譯器所選的類型。在處理枚舉類型的
switch
語句中不要實現default
分支。這樣的話,加入新枚舉之後,編譯器就會提示開發者:switch
語句並未處理所有枚舉。