1. 程式人生 > >Objective-C——OC中列舉的使用

Objective-C——OC中列舉的使用

OC中列舉的使用

前言

由於Objective-C是C語言的超集,所以在OC程式中一般的常量表示也有巨集定義   以及const 變數型別 變數 和列舉等形式,這裡我們介紹些列舉的幾種適用場合

用列舉表示一個操作的不同狀態

我們隨便舉個例子,比如說你想跟別人通過簡訊息聊天而需要傳送資訊給對方,這個時候我們需要一組該動作相關聯的狀態碼來表示我們傳送資訊這一操作中的各個狀態(沒傳送、 傳送中、和傳送完 我們暫且就分為這三個簡單的狀態)從技術層面上來說我們的確可以採用巨集定義或者是const變數的形式

  • 先來說下巨集定義
// 巨集定義
#define
MESSAGE_STATE_DISSEND 0
#define MESSAGE_STATE_SENDING 1 #define MESSAGE_STATE_SENDED 2
// 列舉
typedef enum MESSAGE_STATE{
    MESSAGE_STATE_DISSEND,
    MESSAGE_STATE_SENDING,
    MESSAGE_STATE_SENDED,
}MESSAGE_STATE;

從上面給出的程式碼說明了很重要的一點:

巨集定義的形式沒有列舉簡潔

而且我們都知道:
巨集定義本身在開發中有這樣的問題,就是不同的開發者有可能在彼此不知道的情況下定義了相同的巨集並且值可能不同,這個時候編譯器並不會報錯和產生警告資訊!這是不能容忍的!

  • 在看const
// oneclass.m
static NSNumber *const MESSAGE_STATE_DISSEND = @0;
static NSNumber *const MESSAGE_STATE_SENDING = @1;
static NSNumber *const MESSAGE_STATE_SENDED = @2;

從程式碼的表現形式我們知道使用static const的形式解決了狀態常量被重寫的問題但是很明顯他沒有列舉簡潔

用列舉編譯器會自動為列舉分配一個獨有的編號從0開始依次遞增1,而且採用列舉更能體現這是一組相關聯的狀態

狀態組合使用列舉

我們在定義一組可自由拼湊狀態的時候是用列舉是更為合適的,我來舉個簡單的例子:
假如我們要為生產手機挑選一組功能怎麼做呢?

// 定義列舉
typedef enum NEW_PHONE_MODULE{
    NEW_PHONE_MODULE_PLAY_MUSIC = 1 << 0,
    NEW_PHONE_MODULE_RECORDING = 1 << 1,
    NEW_PHONE_MODULE_SEND_MESSAGE = 1 << 2, 
}NEW_PHONE_MODULE;
NEW_PHONE_MODULE new_phone_module = NEW_PHONE_MODULE_PLAY_MUSIC |
NEW_PHONE_MODULE_RECORDING |  NEW_PHONE_MODULE_SEND_MESSAGE;

// 使用組合(這裡當手機具有播放音樂的功能就列印資訊)

if(new_phone_module & NEW_PHONE_MODULE_PLAY_MUSIC)
{
    NSLog(@"新手機有播放音樂的功能!");
}

switch中使用列舉

MESSAGE_STATE state = MESSAGE_STATE_SENDING;
switch (state)
{
    MESSAGE_STATE_DISSEND:
        NSLog(@"未傳送");
        break;
    MESSAGE_STATE_SENDING:
        NSLog(@"傳送中");
        break;
    MESSAGE_STATE_SENDED:
        NSLog(@"已傳送");
        break;
}

這裡需要注意的是,不要有switch語句中的default分支,因為一旦我們新增新的狀態了在switch語句中沒處理的話在沒有default情況下編譯器就能夠發現,而有了default分支他就會自動處理該狀態這是我們不願意看到的。