iOS枚舉(位移枚舉)

什么是枚舉

在程序設(shè)計語言中碳想,一般用一個數(shù)值來代表某一狀態(tài)宋渔,這種處理方法不直觀弹灭,易讀性差督暂。如果能在程序中用自然語言中有相應(yīng)含義的單詞來代表某一狀態(tài),則程序就很容易閱讀和理解穷吮。也就是說逻翁,事先考慮到某一變量可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值捡鱼,這種方法稱為枚舉方法八回,用這種方法定義的類型稱枚舉類型。

枚舉的命名

定義的枚舉類型名稱通常與項目的類文件前綴相同驾诈,或者是類庫框架縮寫,或者跟隨具體業(yè)務(wù)名,如果開頭是縮寫要大寫表示缠诅,跟隨其后的命名應(yīng)采用駝峰命名法則,命名應(yīng)準確表述枚舉表示的意義乍迄,枚舉中各個值都應(yīng)以定義的枚舉類型開頭管引,其后跟隨各個枚舉值對應(yīng)的狀態(tài)、選項或者狀態(tài)碼闯两。

狀態(tài)與選項(states & options)

狀態(tài)

同時只能有一種褥伴,如JFStateError,JFStateUnknow谅将,不可能同時是JFStateErrorJFStateUnknow。如下:

typedef enum JFState {
    JFStateOK = 0,
    JFStateError,
    JFStateUnknow
} JFState;

另外重慢,我們經(jīng)常在switch語句中使用枚舉來表示各個狀態(tài)饥臂,根據(jù)各個狀態(tài)來進項判斷。如下

JFState state = JFStateOK;

    switch (state)
    {
        case JFStateOK:
        {
        }
            break;
        case JFStateError:
        {
        }
            break;
        case JFStateUnknow:
        {
        }
            break;
    }

這里大家總是習慣在switch語句中加上default分支似踱,但是在使用枚舉來定義狀態(tài)的時候筆者不建議大家這么做隅熙。主要有以下幾點:

  • 使用枚舉時,所需判斷的幾種狀態(tài)是確認可控的屯援,不需要在進行default的判斷
  • 在之后的拓展中猛们,如果加入了新的枚舉類型,則編譯器會發(fā)出警告提示開發(fā)者switch未處理所有枚舉信息狞洋,提示新加入的枚舉未在switch中進行處理弯淘,如果加上default分之的話就不會有該判斷

選項

定義選項的時候。若這些選項可以彼此組合吉懊,則更應(yīng)如此庐橙。只要枚舉定義得對,各選項之間就可通過“按位或操作符”(bitwise OR operator)來組合借嗽。例如态鳖,iOS UI框架中有如下枚舉類型,用來表示某個視圖應(yīng)該如何在水平或垂直方向上調(diào)整大小恶导。

位移枚舉(可復選的枚舉) 使用位移實現(xiàn)選項變量

使用枚舉定義選項,每個選項均可啟用或禁用浆竭,使用上述方式來定義枚舉值,每個枚舉值所對應(yīng)的二進制表示中,只有1個二進制位的值是1惨寿。用“按位或操作符”可組合多個選項邦泄。用 | 來隔開

首先來補充下位運算的知識吧 _

  • 1、按位與"&"

只有對應(yīng)的兩個二進位均為1時裂垦,結(jié)果位才為1,否則為0>比如9&5蕉拢,其實就是1001&0101=0001,因此9&5=1>二進制中晕换,與1相&就保持原位午乓,與0相&就為0

  • 2闸准、按位或"|"

只要對應(yīng)的二個二進位有一個為1時,結(jié)果位就為1恕汇,否則為0或辖。>比如9|5,其實就是1001|0101=1101颂暇,因此9|5=13

  • 3、左移<<

把整數(shù)a的各二進位全部左移n位但惶,高位丟棄,低位補0膀曾。左移n位其實就是乘以2的n次方。>例如1<<2 就是0001左移2為0100添谊,因此1<<2=4

枚舉定義如下:

typedef NS_OPTIONS(NSUInteger, ActionType) {

    ActionTypeUp    = 1 << 0, //  0001  1
    ActionTypeDown  = 1 << 1, //  0010  2
    ActionTypeRight = 1 << 2, //  0100  4
    ActionTypeLeft  = 1 << 3, //  1000  8

};

枚舉判斷處理:

- (void)action:(ActionType)type
{
    if (type == 0)
    {
        return;
    }

    if ((type & ActionTypeUp) == ActionTypeUp)
    {
        NSLog(@"上");
    }

    if ((type & ActionTypeDown) == ActionTypeDown)
    {
        NSLog(@"下");
    }

    if ((type & ActionTypeLeft) == ActionTypeLeft)
    {
        NSLog(@"左");
    }

    if ((type & ActionTypeRight) == ActionTypeRight)
    {
        NSLog(@"右");
    }

}

于是,調(diào)用的時候我們通常這么寫

ActionType type = ActionTypeUp | ActionTypeLeft | ActionTypeRight | ActionTypeDown; // 15
[self action:type];
  • 定義這個actionType的選項為四個斩狱,這里按位異或,0001|0010|0100|1000=1111所踊,得到結(jié)果這個type為15泌枪。
  • 調(diào)用方法[self action:type],進行按位與操作:type & ActionTypeUp秕岛,1111&0001=0001碌燕,得到這個是否選擇了該選項。然后便可以進行判斷了继薛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陆蟆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惋增,更是在濱河造成了極大的恐慌,老刑警劉巖改鲫,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诈皿,死亡現(xiàn)場離奇詭異,居然都是意外死亡像棘,警方通過查閱死者的電腦和手機稽亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕题,“玉大人截歉,你說我怎么就攤上這事⊙塘悖” “怎么了瘪松?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵咸作,是天一觀的道長。 經(jīng)常有香客問我宵睦,道長记罚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任壳嚎,我火速辦了婚禮桐智,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟馅。我一直安慰自己说庭,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布郑趁。 她就那樣靜靜地躺著刊驴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穿撮。 梳的紋絲不亂的頭發(fā)上缺脉,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音悦穿,去河邊找鬼攻礼。 笑死,一個胖子當著我的面吹牛栗柒,可吹牛的內(nèi)容都是我干的礁扮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞬沦,長吁一口氣:“原來是場噩夢啊……” “哼太伊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逛钻,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曙痘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體边坤,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡茧痒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了超燃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桩蓉。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖洽瞬,靈堂內(nèi)的尸體忽然破棺而出业汰,到底是詐尸還是另有隱情,我是刑警寧澤样漆,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布放祟,位于F島的核電站,受9級特大地震影響鞋喇,放射性物質(zhì)發(fā)生泄漏眉撵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一罐韩、第九天 我趴在偏房一處隱蔽的房頂上張望污朽。 院中可真熱鬧,春花似錦矾睦、人聲如沸颓芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽束世。三九已至,卻和暖如春毁涉,著一層夾襖步出監(jiān)牢的瞬間锈死,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工其屏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偎行,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蛤袒,卻偏偏與公主長得像妙真,于是被迫代替她去往敵國和親询一。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容