美文网首页iOS开发随手笔记
三分钟学会枚举的正确用法

三分钟学会枚举的正确用法

作者: 择势量投 | 来源:发表于2018-04-18 15:40 被阅读8次

    前言

       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(选项)?

    以上的都不重要,看我的证明就行了。

    状态的表示姿势

    错误姿势

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

    为什么这样做不好:

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

    正确姿势

    typedef enum {
        UIScrollViewKeyboardDismissModeNone = 0,
        UIScrollViewKeyboardDismissModeOnDrag,          
        UIScrollViewKeyboardDismissModeInteractive
    } UIScrollViewKeyboardDismissMode;
    
    // 指明枚举类型
    UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;
    
    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;
    // or
    UIInteger 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(@"帅");
    }
    

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


    2016-05-222016-05-22-1.png

    相关文章

      网友评论

      本文标题:三分钟学会枚举的正确用法

      本文链接:https://www.haomeiwen.com/subject/fxovkftx.html