5分钟学会枚举的正确使用姿势-Enumeration宏

来源:互联网 发布:淘宝修改密码弹回登陆 编辑:程序博客网 时间:2024/04/28 15:44

原文链接

前言

Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态、状态码、选项”。

状态、状态码、选项

什么是状态:同时只能出现一个值(状态码就是他的值),比如这个ScrollView里的枚举:

typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {    UIScrollViewKeyboardDismissModeNone,    UIScrollViewKeyboardDismissModeOnDrag,              UIScrollViewKeyboardDismissModeInteractive};

什么是选项:同时可以出现一个或多个值:

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};

为什么要使用NS_ENUM(状态) 和 NS_OPTIONS(选项)?

  1. 苹果推荐。
  2. 大家都这样写。
  3. 其他的不好学。
  4. 以上的都不重要,看我的证明就行了

状态的表示姿势

错误姿势

#define UIScrollViewKeyboardDismissModeNone 0#define UIScrollViewKeyboardDismissModeOnDrag 1          #define UIScrollViewKeyboardDismissModeInteractive 2// 接收值就得这样:int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;

为什么这样做不好:

  1. 宏定义没有类型约束,只是单纯的替换。
    • 可读性较差。
    • 可以用int也可以用UIInteger来接收。

正确姿势

typedef enum {    UIScrollViewKeyboardDismissModeNone = 0,    UIScrollViewKeyboardDismissModeOnDrag,              UIScrollViewKeyboardDismissModeInteractive} UIScrollViewKeyboardDismissMode;// 指明枚举类型UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;

用起来就是这样的:

- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode {    switch (mode) {        case UIScrollViewKeyboardDismissModeNone:            //...            break;        case UIScrollViewKeyboardDismissModeOnDrag:            //...            break;        case UIScrollViewKeyboardDismissModeInteractive:            //...            break;    }}

这样枚举解决了上面1和2的缺点,但是第3点还是没有解决,我依然可以这样搞:

int mode = UIScrollViewKeyboardDismissModeNone;// orUIInteger mode = UIScrollViewKeyboardDismissModeNone;

完美姿势

NS_ENUM是枚举在Objective-C中的”升级版”,改进后代码如下:

typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {    UIScrollViewKeyboardDismissModeNone,    UIScrollViewKeyboardDismissModeOnDrag,              UIScrollViewKeyboardDismissModeInteractive};

代码很简单,不理解的话可以评论求解答。

选项的使用姿势

如果有一个”选项变量”要同时表示一个或者多个值肿么办?这时就得上我们的NS_OPTIONS了。
比如有这样一个简单的例子:

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(@"帅");}

“|”赋值完后,富帅的内心(内存)其实是长这样的:

富帅的内心

写在结尾

富帅点个赞呗。

Done

作者 @biggergao

2016年05月22日

0 0
原创粉丝点击