OC枚舉之簡介

背景

對于開發(fā)者來說,枚舉是最普通不過的一種開發(fā)手段。它通常用來定義一種類型的狀態(tài),這個狀態(tài)可能有2個,也可能有7,8個或者更多。舉個例子:

typedef NS_ENUM(NSInteger, ShareType) {
    ShareType_Unknown = 0,
    ShareType_WeiXinGroup    = 1 ,
    ShareType_WeiXinFriend    = 2,
    ShareType_SMS              = 3,
    ShareType_WeiboShare       = 4,
    ShareType_WeiboAuthor      = 5,
    ShareType_QQAuthor         = 6,
    ShareType_QQShareQZone     = 7,
    ShareType_link             = 8,
};

這是一個定義分享類型的枚舉,一共9中分享類型。

不優(yōu)雅的地方

接下來我們來看一下這樣定義有什么不妥的地方。

  • 場景一
    如果想辨識是哪一種分享類型,我們可能會這么寫
if (type == ShareType_WeiXinGroup) {
        doShare1();
}

好像沒啥問題。

  • 場景二
    那如果我們想讓這個type是ShareType_WeiXinGroup,ShareType_WeiXinFriend,ShareType_QQAuthor,ShareType_QQShareQZone中的一個時,做doShare1();
    那么我們就會這樣寫代碼:
if (type == ShareType_WeiXinGroup ||
    type == ShareType_WeiXinFriend ||
    type == ShareType_QQAuthor ||
    type == ShareType_QQShareQZone) {
        doShare1();
}

如果你有代碼潔癖的話可能就看不慣這樣的代碼了。
那么有沒有稍微優(yōu)雅的寫法呢?
答案是肯定的。

優(yōu)雅的寫法

我們重新定義這個枚舉值

typedef NS_OPTIONS(NSInteger, ShareType) {
    ShareType_Unknown = 1 << 0,
    ShareType_WeiXinGroup    = 1 << 1,
    ShareType_WeiXinFriend    = 1 << 2,
    ShareType_SMS              = 1 << 3,
    ShareType_WeiboShare       = 1 << 4,
    ShareType_WeiboAuthor      = 1 << 5,
    ShareType_QQAuthor         = 1 << 6,
    ShareType_QQShareQZone     = 1 << 7,
    ShareType_link             = 1 << 8,
};

回頭看上面的兩個場景:

  • 場景一
    我們的代碼如下:
if (type & ShareType_WeiXinGroup) {
        doShare1();
}
  • 場景二
NSInteger fitableTypes = ShareType_WeiXinGroup | ShareType_WeiXinFriend | ShareType_QQAuthor | ShareType_QQShareQZone;
if (type & fitableTypes) {
        doShare1();
}

我們看到場景一的情況好像優(yōu)勢不是很大,但是場景二就充分體現(xiàn)了它的優(yōu)雅性。

原理

其實就是簡單的用了二進制中的位移運算(<<),&運算符以及 | 運算符
例如

##場景一
 ShareType_Unknown = 1 << 0, 二進制的表示為 01
 ShareType_WeiXinGroup = 1 << 1, 二進制的表示為 10

 ShareType_Unknown & ShareType_WeiXinGroup 
01
10
二進制每一位進行&運算 結果為 00 判斷不通過

 ShareType_WeiXinGroup & ShareType_WeiXinGroup 
10
10
二進制每一位進行&運算 結果為 10 判斷通過

##場景二
ShareType_WeiXinGroup | ShareType_WeiXinFriend | ShareType_QQAuthor | ShareType_QQShareQZone
0000010
0000100
0100000
1000000
二進制每一位進行|運算 結果為1100110 記為A

ShareType_WeiXinGroup & A 二進制每一位進行&運算 結果為0000010 判斷通過
ShareType_link & A 二進制每一位進行&運算00000000 判斷不通過

適用場景

當枚舉的類型相對較多的時候,推薦使用該種寫法,讓代碼更加優(yōu)雅。
當枚舉的類型相對較少(2個或者3個)的時候,兩種寫法沒什么差別。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容