52個有效方法(5) - 用枚舉表示狀態(tài)玖像、選項紫谷、狀態(tài)碼

枚舉(enum)

  • 枚舉(enum)只是一種常量的命名方式。是C語言中的一種基本數(shù)據(jù)類型,是一個"被命名的整型常量"的集合捐寥。

  • 規(guī)范的定義代碼中的狀態(tài)笤昨、選項等“常量”。

  • 不參與內(nèi)存的占用和釋放握恳。

  • 在開發(fā)中使用枚舉的目的,是為了增加代碼的可讀性瞒窒。

用 NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型,并指明其底層數(shù)據(jù)類型乡洼。

  • NS_ENUM

    NS_ENUM一般用來定義默認的枚舉值

/* NS_ENUM supports the use of one or two arguments. The first argument is always the integer type used for the values of the enum. The second argument is an optional type name for the macro. When specifying a type name, you must precede the macro with 'typedef' like so:
 
typedef NS_ENUM(NSInteger, NSComparisonResult) {
    ...
};
 
If you do not specify a type name, do not use 'typedef'. For example:
 
NS_ENUM(NSInteger) {
    ...
};
*/
#define NS_ENUM(...) CF_ENUM(__VA_ARGS__)
  • NS_OPTIONS

    NS_OPTIONS一般用來定義位移相關(guān)操作的枚舉值

#define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)

枚舉(Enum)與狀態(tài)(states)

某個對象所經(jīng)歷的各種狀態(tài)可以定義為一個的枚舉集(enumeration set)

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};
  • 編譯器會為每個枚舉值分配一個獨有的編號崇裁,從0開始,依次加1束昵。

  • 一個字節(jié)最多可表示0~255共256種(2^8)枚舉變量拔稳。

枚舉(enum)與選項(options)

在定義選項的時候,應(yīng)該使用枚舉類型锹雏。若這些選項可以彼此組合巴比,則更應(yīng)如此。只要枚舉定義得對礁遵,各選項之間就可以通過 “按位或操作符”來組合轻绞。

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
};
  • 選項是用位運算的方式定義的
UIViewAutoresizingNone                            0 0 0 0 0 0 0 0
UIViewAutoresizingFlexibleLeftMargin              0 0 0 0 0 0 0 1
UIViewAutoresizingFlexibleWidth                   0 0 0 0 0 0 1 0
UIViewAutoresizingFlexibleRightMargin             0 0 0 0 0 1 0 0
UIViewAutoresizingFlexibleTopMargin               0 0 0 0 1 0 0 0
UIViewAutoresizingFlexibleHeight                  0 0 0 1 0 0 0 0
UIViewAutoresizingFlexibleBottomMargin            0 0 1 0 0 0 0 0
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight 
                                                  0 0 0 1 0 0 1 0
  • <<帶符號左移 (n<<2 將整型值帶符號左移2位 )

    • 將一個運算符對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)

    • 操作數(shù)每左移一位佣耐,相當(dāng)于該數(shù)乘以2

    • 例如:3<<2 后政勃,結(jié)果為12
      3的二進制位11,左移兩位后兼砖,右邊補2個0就是1100稼病。1100轉(zhuǎn)為10進制為12选侨。

    • 左移操作就相當(dāng)于2的2次方×3。 每左移1位次方就增1

  • >>帶符號右移 (n>>2 將整型值帶符號右移2位 )

    • 將一個數(shù)的各二進制位全部右移若干位然走,正數(shù)左補0援制,負數(shù)左補1,右邊丟棄芍瑞。

    • 操作數(shù)每右移一位晨仑,相當(dāng)于該數(shù)除以2 ,然后取整

    • 例如:9>>1 后,結(jié)果為4
      9的二進制為1001拆檬,右移1位后洪己,左正數(shù)補0,右邊丟棄竟贯。結(jié)果為 0100答捕。轉(zhuǎn)為10進制后為4。

枚舉(enum)與狀態(tài)碼(codes)

枚舉用法也可用于 switch 語句屑那。在處理枚舉類型的switch語句中不要實現(xiàn)default分支拱镐。

typedef NS_ENUM(NSUInteger, EOCConnectionState) {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected
};

switch (_currentState) {
    EOCConnectionStateDisconnected:
      //...
      break;
    EOCConnectionStateConnecting:
      //...
      break;
    EOCConnectionStateConnected:
      //...
      break;
}
要點:
  1. 應(yīng)該用枚舉表示狀態(tài)機的狀態(tài)、傳遞給方法的選項以及狀態(tài)碼等值持际,給這些值起個易懂的名字沃琅,就像監(jiān)聽網(wǎng)絡(luò)狀態(tài)的枚舉。

  2. 如果把傳遞給某個方法的選項表示為枚舉類型蜘欲,而多個選項又可同時使用益眉,那么就將各選項定義為2的冪,以便通過按位或操作將其組合起來姥份。

  3. 用 NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型郭脂,并指明其底層數(shù)據(jù)類型。這樣可以確保枚舉是用開發(fā)者所選的底層數(shù)據(jù)類型實現(xiàn)出來的澈歉,而不會采用編譯器所選的類型朱庆。

  4. 在處理枚舉類型的switch語句中不要實現(xiàn)default分支。這樣的話闷祥,加入新枚舉之后娱颊,編譯器就會提示開發(fā)者:switch語句并未處理所有枚舉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凯砍,一起剝皮案震驚了整個濱河市箱硕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悟衩,老刑警劉巖剧罩,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異座泳,居然都是意外死亡惠昔,警方通過查閱死者的電腦和手機幕与,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镇防,“玉大人啦鸣,你說我怎么就攤上這事±囱酰” “怎么了诫给?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啦扬。 經(jīng)常有香客問我中狂,道長,這世上最難降的妖魔是什么扑毡? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任胃榕,我火速辦了婚禮,結(jié)果婚禮上瞄摊,老公的妹妹穿的比我還像新娘勋又。我一直安慰自己,他們只是感情好泉褐,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟蜡,像睡著了一般膜赃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揉忘,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天跳座,我揣著相機與錄音,去河邊找鬼泣矛。 笑死疲眷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的您朽。 我是一名探鬼主播狂丝,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哗总!你這毒婦竟也來了几颜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤讯屈,失蹤者是張志新(化名)和其女友劉穎蛋哭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮母,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谆趾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年躁愿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪蓬。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡彤钟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怜跑,到底是詐尸還是另有隱情样勃,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布性芬,位于F島的核電站峡眶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏植锉。R本人自食惡果不足惜辫樱,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俊庇。 院中可真熱鬧狮暑,春花似錦、人聲如沸辉饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彭沼。三九已至缔逛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姓惑,已是汗流浹背褐奴。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留于毙,地道東北人敦冬。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像唯沮,于是被迫代替她去往敵國和親脖旱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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