背景
對于開發(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)雅性垂寥。
原理
其實就是簡單的用了二進(jìn)制中的位移運算(<<),&運算符以及 | 運算符
例如
##場景一
ShareType_Unknown = 1 << 0, 二進(jìn)制的表示為 01
ShareType_WeiXinGroup = 1 << 1, 二進(jìn)制的表示為 10
ShareType_Unknown & ShareType_WeiXinGroup
01
10
二進(jìn)制每一位進(jìn)行&運算 結(jié)果為 00 判斷不通過
ShareType_WeiXinGroup & ShareType_WeiXinGroup
10
10
二進(jìn)制每一位進(jìn)行&運算 結(jié)果為 10 判斷通過
##場景二
ShareType_WeiXinGroup | ShareType_WeiXinFriend | ShareType_QQAuthor | ShareType_QQShareQZone
0000010
0000100
0100000
1000000
二進(jìn)制每一位進(jìn)行|運算 結(jié)果為1100110 記為A
ShareType_WeiXinGroup & A 二進(jìn)制每一位進(jìn)行&運算 結(jié)果為0000010 判斷通過
ShareType_link & A 二進(jìn)制每一位進(jìn)行&運算00000000 判斷不通過
適用場景
當(dāng)枚舉的類型相對較多的時候另锋,推薦使用該種寫法滞项,讓代碼更加優(yōu)雅。
當(dāng)枚舉的類型相對較少(2個或者3個)的時候夭坪,兩種寫法沒什么差別文判。