正確的使用枚舉(Enum)


狀態與選項的區別(states and options)

在用enum之前,我個人覺得,區分一下狀態和選項的概念還是很必要的。

狀態,同時只能有一種,如“OK”,“Error”,不可能同時是OK和Error。
選項,同時可以有一種或一種以上,如App可以同時支持橫屏和豎屏,橫屏豎屏在這個時候就是“屏幕方向”的兩種不同的選項。

接下來,我們看看如何用枚舉定義狀態和選項。

enum與狀態(states)

typedef enum _TTGState {
    TTGStateOK  = 0,
    TTGStateError,
    TTGStateUnknow
} TTGState;

//指明枚舉類型
TTGState state = TTGStateOK;

用的時候就如下:

- (void)dealWithState:(TTGState)state {
    switch (state) {
        case TTGStateOK:
            //...
            break;
        case TTGStateError:
            //...
            break;
        case TTGStateUnknow:
            //...
            break;
    }
}

enum與選項 (options)

選項,就是說一個“選項變量”的類型要能夠同時表示一個或多個組合的選擇,如下例子:

//方向,可同時支持一個或多個方向
typedef enum _TTGDirection {
    TTGDirectionNone = 0,
    TTGDirectionTop = 1 << 0,
    TTGDirectionLeft = 1 << 1,
    TTGDirectionRight = 1 << 2,
    TTGDirectionBottom = 1 << 3
} TTGDirection;

 

看,這里的選項是用位運算的方式定義的,這樣的好處就是,我們的選項變量可以如下表示:

//用“或”運算同時賦值多個選項
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變量的實際內存如下:

內存示意圖

這樣,用位運算,就可以同時支持多個值。

enum在Objective-C中的“升級版”

一般來說,我們不能指定枚舉變量的實際類型是什么,就是說,我們不知道枚舉最后是int型,還是其他的什么類型。但是從C++ 11開始,我們可以為枚舉指定其實際的存儲類型,如下語法:

enum TTGState : NSInteger {/*...*/};

 

但是,我們在定義枚舉的時候如何保證兼容性呢?Foundation框架已經為我們提供了更加“統一、便捷”的枚舉定義方法,我們重新定義上面的例子:

//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”定義,保證統一。

總結

充分的用好枚舉,可以增強代碼的可讀性,減少各種“錯誤”,讓代碼更加的規范。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM