Swift枚舉實戰

尊重知識,轉發請注明出處:Swift枚舉實戰


enum

概要

枚舉(enum)我們再熟悉不過的數據類型,縱觀C、OC、Swift,枚舉的定義基本都是一樣的:枚舉是一個被命名的常量的集合。本文主要介紹我在項目開發中用到的Swift枚舉的一些實用經驗。

C語言的枚舉比較簡單,絕大部分書籍在講解枚舉語法時都很難超過2頁。

OC中的枚舉是基于C語言的枚舉,不同的是OC對枚舉進行了很多擴展,使其功能性更加豐富。

Swift中的枚舉則是完全不同的一種數據類型,具有很多面向對象的特點,語法簡潔,功能豐富,同時在很多地方更符合人們對于世界的直觀印象。

再也沒必要讓你的枚舉成員只能是整型了

還是那個主要學習枚舉就逃不開的例子:季節

    enum Season {
        case spring
        case summer
        case autumn
        case winter
    }

上面是用Swift枚舉定義的季節,乍一看沒什么不同,無非是多了關鍵字case,在C和OC中spring的默認值是0,summer是1,后續依次類推,而在Swift中并沒有給每一個枚舉成員分配默認值,Swift的枚舉名就是一個枚舉實例,對應這個一個枚舉值。這種做法更加符合人類對世界的認知,春天就是春天,不是整數0,夏天就是夏天,也不是整數1。

當然Swift也是支持為每一個枚舉成員指定類型的,更加可喜的是,指定的類型再也不僅限于Int了,還可以是StringNSNumber等我們常用的類型。如下:

    enum Season: Int {
        case spring
        case summer
        case autumn
        case winter
    }

    enum Season: String {
        case spring
        case summer
        case autumn
        case winter
    }

更加靈活的使用枚舉

在開發中時常需要從服務器獲取數據,然后判斷,比如服務器傳“0”代表春天,這個“0”有可能是字符串或者NSNumber,我們可以統一轉換成字符串,然后再轉換成整型,與OC中的Season枚舉對比判斷。

在Swift中由于可以為枚舉的原始值指定String類型,因此將從服務器不僅僅可以傳“0”代表春天了,也可以直接傳“spring”字符串,這樣就不會出現產數字時會出現的NSNumber類型了,同時使用起來也更加方便,代碼如下;

    enum Season: String {
        case spring
        case summer
        case autumn
        case winter
    }
    
    //假設這是從服務器獲取的季節數據
    let season = "autumn"
    
    switch season {
    case Season.spring.rawValue:
        break
    case Season.summer.rawValue:
        break
    case Season.autumn.rawValue:
        break
    case Season.winter.rawValue:
        break
    default :
        break
    }

注意: rawValue是枚舉成員的原始值,類型就是定義枚舉時指定的,這里是String;

上面的雖然可以直接使用服務器獲取的字符串,但是還是很繁瑣,尤其是枚舉成員很多時,可以做如下的變動:

    enum Season: String {
        case spring
        case summer
        case autumn
        case winter
    }
    
    //假設這是從服務器獲取的季節數據
    let season = "autumn"
    
    if let endSeason = Season(rawValue: season) {
        switch endSeason {
        case .spring:
            break
        case .summer:
            break
        case .autumn:
            break
        case .winter:
            break
    }

注意: 1、通過Swift構造器可以將字符串轉換成枚舉類型,但是這里需要注意的是這是一個可失敗的構造器,也就是有可能服務器給的字符串并不對,導致得到的枚舉值是空,所以這里可以使用可選綁定防止崩潰; 2、當獲取到由字符串轉化來的季節枚舉值后,使用switch就很簡單了,Swift支持直接使用點語法調用枚舉成員,這樣我們只需要一個點就可以很方便的調出各個枚舉成員了; 3、這里省略了default分支,其實很容易理解,因為枚舉的成員數量是固定的,將所有的枚舉成員都列舉出來,自然不會再出現default分支。

監聽枚舉值

假如我們的程序會根據季節的不同更換相應的季節背景圖,而季節是一個隨機變化枚舉,這時我們需要監聽枚舉值的變化,實時改變背景圖,無論是使用通知、KVO、代理等等都不容易實現,而在Swift中就變得很簡單了。代碼如下:

var season = Season.spring {
    willSet {
        if newValue != season {
            print("季節即將發生變化")
        }
    }
    
    didSet {
        if oldValue != season {
            print("季節已經發生變化")
        }
    }
}

這里使用了屬性觀察者,C和OC中的枚舉沒有屬性這個概念,而Swift中的枚舉更像是一個對象,因此可以很方便的使用這個功能實現對枚舉值的監聽。
注意: 1、willSet是枚舉值在即將被賦值之前調用的,而didSet是枚舉值被改變之后調用的,時間點不一樣唯一,大家可以根據實際的情況選取; 2、willSet中的的newValue是即將被改變的枚舉值,而didSet中的oldValue是已經改變的枚舉值,這個是Swift提供的隱式形參名,直接寫出來就可以了。

尾巴

當然Swift還有關聯值,也就相當于為每一個枚舉成員增加“屬性”,這個功能我在項目中暫時還沒有應用到,相信也會有很大的用處,小伙伴們可以自己嘗試一下。這里簡單總結下我使用Swift的枚舉的經驗,希望能幫助到大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容