Objective-C 枚舉 中位運算 的使用

前言

Enum,也就是枚舉,從C語言開始就有了,C++、Java、Objective-C、Swift這些語言,固然都有對應的枚舉類型,功能可能有多有少,可是最核心的仍是一個—-規範的定義代碼中的狀態、選項等「常量」。框架

 Use Enumerations for States, Options, and Status Codes

本節的內容就是如何正確的使用枚舉。spa

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

在用 enum 以前,我我的以爲,區分一下狀態和選項的概念仍是很必要的。blog

狀態,同時只能有一種,如「 OK 」,「 Error 」,不可能同時是OK和Error。內存

選項,同時能夠有一種或一種以上,如App能夠 同時 支持橫屏和豎屏,橫屏豎屏在這個時候就是「屏幕方向」的兩種不一樣的選項。開發

接下來,咱們看看如何用枚舉定義狀態和選項。編譯器

enum與狀態(states)

很差的作法

常常看到這樣的寫法:it

#define STATE_OK 0
#define STATE_ERROR 1
#define STATE_UNKNOW 2
 
//直接用int型變量接收
int STATE = STATE_UNKNOW;

這樣作有以下「不恰當」:io

  • 宏定義沒有類型約束,只是單純的替換。
  • 沒法限制狀態的全部狀況,如,認爲的將STATE賦值成3,程序可能就會出錯,找不到匹配的狀態,由於編譯器不會對「 STATE = 3; 」提出警告。

正確的作法

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框架已經爲咱們提供了更加「統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 」定義,保證統一。

總結

充分的用好枚舉,能夠加強代碼的可讀性,減小各類「錯誤」,讓代碼更加的規範。

相關文章
相關標籤/搜索