原文连接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(@"帅"); }
“|”赋值完后,富帅的心里(内存)实际上是长这样的: