原文連接html
Enum,枚舉,相信大部分編程語言都有對應的枚舉類型,功能可能有多有少,可是枚舉最核心的功能是 「規範的定義代碼中的狀態、狀態碼、選項」。ios
什麼是狀態:同時只能出現一個值(狀態碼就是他的值),好比這個ScrollView裏的枚舉:git
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) { UIScrollViewKeyboardDismissModeNone, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive };
什麼是選項:同時能夠出現一個或多個值:github
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 };
#define UIScrollViewKeyboardDismissModeNone 0 #define UIScrollViewKeyboardDismissModeOnDrag 1 #define UIScrollViewKeyboardDismissModeInteractive 2 // 接收值就得這樣: int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;
爲何這樣作很差:編程
typedef enum { UIScrollViewKeyboardDismissModeNone = 0, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive } UIScrollViewKeyboardDismissMode; // 指明枚舉類型 UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;
用起來就是這樣的:app
- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode { switch (mode) { case UIScrollViewKeyboardDismissModeNone: //... break; case UIScrollViewKeyboardDismissModeOnDrag: //... break; case UIScrollViewKeyboardDismissModeInteractive: //... break; } }
這樣枚舉解決了上面1和2的缺點,可是第3點仍是沒有解決,我依然能夠這樣搞:編程語言
int mode = UIScrollViewKeyboardDismissModeNone; // or UIInteger mode = UIScrollViewKeyboardDismissModeNone;
NS_ENUM是枚舉在Objective-C中的"升級版",改進後代碼以下:ui
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) { UIScrollViewKeyboardDismissModeNone, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive };
代碼很簡單,不理解的話能夠評論求解答。spa
若是有一個"選項變量"要同時表示一個或者多個值腫麼辦?這時就得上咱們的NS_OPTIONS了。
好比有這樣一個簡單的例子:code
typedef NS_OPTIONS(NSUInteger, JZZPersonType) { JZZPersonTypeHigh = 0, JZZPersonTypeRich = 1 << 0, JZZPersonTypePretty = 1 << 1 };
能夠看到,咱們這裏的選項是用的位運算的方式定義的,這樣的好處就是咱們的選項變量能夠這樣來表示:
// 用「或|」運算同時賦值多個選項 JZZPersonType personType = JZZPersonTypeHigh | JZZPersonTypeRich | JZZPersonTypePretty; // 用「與&」運算取出對應位 if (personType & JZZPersonTypeHigh) { NSLog(@"高"); } if (personType & JZZPersonTypeRich) { NSLog(@"富"); } if (personType & JZZPersonTypePretty) { NSLog(@"帥"); }
「|」賦值完後,富帥的心裏(內存)實際上是長這樣的: