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

「|」賦值完後,富帥的心裏(內存)實際上是長這樣的:

相關文章
相關標籤/搜索