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

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

原文连接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
};

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

  1. 苹果推荐。
  2. 你们都这样写。
  3. 其余的很差学。
  4. 以上的都不重要,看个人证实就好了

状态的表示姿式

错误姿式

#define UIScrollViewKeyboardDismissModeNone 0
#define UIScrollViewKeyboardDismissModeOnDrag 1          
#define UIScrollViewKeyboardDismissModeInteractive 2

// 接收值就得这样:
int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;

为何这样作很差:编程

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

正确姿式

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

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

相关文章
相关标签/搜索