Enum,也就是枚舉,從C語言開始就有了,C++、Java、Objective-C、Swift這些語言,固然都有對應的枚舉類型,功能可能有多有少,可是最核心的仍是一個—規範的定義代碼中的狀態、選項等「常量」。java
本節的內容就是如何正確的使用枚舉。ios
在用enum以前,我我的以爲,區分一下狀態和選項的概念仍是很必要的。objective-c
狀態,同時只能有一種,如「OK」,「Error」,不可能同時是OK和Error。
選項,同時能夠有一種或一種以上,如App能夠同時支持橫屏和豎屏,橫屏豎屏在這個時候就是「屏幕方向」的兩種不一樣的選項。swift
接下來,咱們看看如何用枚舉定義狀態和選項。框架
常常看到這樣的寫法:ui
#define STATE_OK 0 #define STATE_ERROR 1 #define STATE_UNKNOW 2 //直接用int型變量接收 int STATE = STATE_UNKNOW;
這樣作有以下「不恰當」:spa
typedef enum _TTGState { TTGStateOK = 0, TTGStateError, TTGStateUnknow } TTGState; //指明枚舉類型 TTGState state = TTGStateOK;
用的時候就以下:.net
- (void)dealWithState:(TTGState)state { switch (state) { case TTGStateOK: //... break; case TTGStateError: //... break; case TTGStateUnknow: //... break; } }
選項,就是說一個「選項變量」的類型要可以同時表示一個或多個組合的選擇,以下例子:code
//方向,可同時支持一個或多個方向 typedef enum _TTGDirection { TTGDirectionNone = 0, TTGDirectionTop = 1 << 0, TTGDirectionLeft = 1 << 1, TTGDirectionRight = 1 << 2, TTGDirectionBottom = 1 << 3 } TTGDirection;
看,這裏的選項是用位運算的方式定義的,這樣的好處就是,咱們的選項變量能夠以下表示:regexp
//用「或」運算同時賦值多個選項 TTGDirection direction = TTGDirectionTop | TTGDirectionLeft | TTGDirectionBottom; //用「與」運算取出對應位 if (direction & TTGDirectionTop) { NSLog(@"top"); } if (direction & TTGDirectionLeft) { NSLog(@"left"); } if (direction & TTGDirectionRight) { NSLog(@"right"); } if (direction & TTGDirectionBottom) { NSLog(@"bottom"); }
direction變量的實際內存以下:
這樣,用位運算,就能夠同時支持多個值。
通常來講,咱們不能指定枚舉變量的實際類型是什麼,就是說,咱們不知道枚舉最後是int型,仍是其餘的什麼類型。可是從C++ 11開始,咱們能夠爲枚舉指定其實際的存儲類型,以下語法:
enum TTGState : NSInteger {/*...*/};
可是,咱們在定義枚舉的時候如何保證兼容性呢?Foundation框架已經爲咱們提供了更加「統1、便捷」的枚舉定義方法,咱們從新定義上面的例子:
//NS_ENUM,定義狀態等普通枚舉 typedef NS_ENUM(NSUInteger, TTGState) { TTGStateOK = 0, TTGStateError, TTGStateUnknow }; //NS_OPTIONS,定義選項 typedef NS_OPTIONS(NSUInteger, TTGDirection) { TTGDirectionNone = 0, TTGDirectionTop = 1 << 0, TTGDirectionLeft = 1 << 1, TTGDirectionRight = 1 << 2, TTGDirectionBottom = 1 << 3 };
因此,在開發Mac、iOS程序中,最好全部的枚舉都用「NS_ENUM」和「NS_OPTIONS」定義,保證統一。
充分的用好枚舉,能夠加強代碼的可讀性,減小各類「錯誤」,讓代碼更加的規範。
轉載自:http://tutuge.me/2015/03/21/effective-objective-c-5-enum/?utm_source=tuicool&utm_medium=referral