Swift枚舉實戰(zhàn)

尊重知識,轉發(fā)請注明出處:Swift枚舉實戰(zhàn)


enum

概要

枚舉(enum)我們再熟悉不過的數(shù)據(jù)類型备闲,縱觀C挤安、OC、Swift戈鲁,枚舉的定義基本都是一樣的:枚舉是一個被命名的常量的集合仇参。本文主要介紹我在項目開發(fā)中用到的Swift枚舉的一些實用經(jīng)驗。

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

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

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

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

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

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

上面是用Swift枚舉定義的季節(jié)导饲,乍一看沒什么不同,無非是多了關鍵字case氯材,在C和OC中spring的默認值是0渣锦,summer是1,后續(xù)依次類推氢哮,而在Swift中并沒有給每一個枚舉成員分配默認值袋毙,Swift的枚舉名就是一個枚舉實例,對應這個一個枚舉值冗尤。這種做法更加符合人類對世界的認知娄猫,春天就是春天,不是整數(shù)0生闲,夏天就是夏天媳溺,也不是整數(shù)1。

當然Swift也是支持為每一個枚舉成員指定類型的碍讯,更加可喜的是悬蔽,指定的類型再也不僅限于Int了,還可以是String捉兴、NSNumber等我們常用的類型蝎困。如下:

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

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

更加靈活的使用枚舉

在開發(fā)中時常需要從服務器獲取數(shù)據(jù)录语,然后判斷,比如服務器傳“0”代表春天禾乘,這個“0”有可能是字符串或者NSNumber澎埠,我們可以統(tǒng)一轉換成字符串术瓮,然后再轉換成整型经伙,與OC中的Season枚舉對比判斷。

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

    enum Season: String {
        case spring
        case summer
        case autumn
        case winter
    }
    
    //假設這是從服務器獲取的季節(jié)數(shù)據(jù)
    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
    }
    
    //假設這是從服務器獲取的季節(jié)數(shù)據(jù)
    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、當獲取到由字符串轉化來的季節(jié)枚舉值后沃暗,使用switch就很簡單了月洛,Swift支持直接使用點語法調用枚舉成員,這樣我們只需要一個點就可以很方便的調出各個枚舉成員了孽锥; 3嚼黔、這里省略了default分支,其實很容易理解惜辑,因為枚舉的成員數(shù)量是固定的唬涧,將所有的枚舉成員都列舉出來,自然不會再出現(xiàn)default分支盛撑。

監(jiān)聽枚舉值

假如我們的程序會根據(jù)季節(jié)的不同更換相應的季節(jié)背景圖碎节,而季節(jié)是一個隨機變化枚舉,這時我們需要監(jiān)聽枚舉值的變化抵卫,實時改變背景圖狮荔,無論是使用通知胎撇、KVO、代理等等都不容易實現(xiàn)殖氏,而在Swift中就變得很簡單了晚树。代碼如下:

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

這里使用了屬性觀察者,C和OC中的枚舉沒有屬性這個概念雅采,而Swift中的枚舉更像是一個對象爵憎,因此可以很方便的使用這個功能實現(xiàn)對枚舉值的監(jiān)聽。
注意: 1总滩、willSet是枚舉值在即將被賦值之前調用的纲堵,而didSet是枚舉值被改變之后調用的,時間點不一樣唯一闰渔,大家可以根據(jù)實際的情況選认; 2冈涧、willSet中的的newValue是即將被改變的枚舉值茂附,而didSet中的oldValue是已經(jīng)改變的枚舉值,這個是Swift提供的隱式形參名督弓,直接寫出來就可以了营曼。

尾巴

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末荞胡,一起剝皮案震驚了整個濱河市妈踊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泪漂,老刑警劉巖廊营,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萝勤,居然都是意外死亡露筒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門敌卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慎式,“玉大人,你說我怎么就攤上這事∷膊叮” “怎么了鞍历?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肪虎。 經(jīng)常有香客問我劣砍,道長,這世上最難降的妖魔是什么扇救? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任刑枝,我火速辦了婚禮,結果婚禮上迅腔,老公的妹妹穿的比我還像新娘装畅。我一直安慰自己,他們只是感情好沧烈,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布掠兄。 她就那樣靜靜地躺著,像睡著了一般锌雀。 火紅的嫁衣襯著肌膚如雪蚂夕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天腋逆,我揣著相機與錄音婿牍,去河邊找鬼。 笑死惩歉,一個胖子當著我的面吹牛等脂,可吹牛的內容都是我干的。 我是一名探鬼主播撑蚌,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼上遥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锨并?” 一聲冷哼從身側響起露该,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睬棚,失蹤者是張志新(化名)和其女友劉穎第煮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑党,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡包警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了底靠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片害晦。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出壹瘟,到底是詐尸還是另有隱情鲫剿,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布稻轨,位于F島的核電站灵莲,受9級特大地震影響,放射性物質發(fā)生泄漏殴俱。R本人自食惡果不足惜政冻,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望线欲。 院中可真熱鬧明场,春花似錦、人聲如沸李丰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趴泌。三九已至逆屡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踱讨,已是汗流浹背魏蔗。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痹筛,地道東北人莺治。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像帚稠,于是被迫代替她去往敵國和親谣旁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,814評論 1 10
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出滋早,用來撰寫 OS X 和 iOS 應用程序 ...
    大L君閱讀 3,225評論 3 25
  • 本章將會介紹 閉包表達式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動閉包枚舉語法使用Switch語句匹配枚舉值關聯(lián)值原...
    寒橋閱讀 1,559評論 0 3
  • 一直沒有時間好好看一下swift杆麸,最近復習了一遍語法搁进,這里記錄swift學習過程中遇到的一些問題和要點,和Obje...
    bomo閱讀 2,353評論 0 25
  • 爸爸退休后昔头,愛上了釣魚饼问。每天去距離家門口800米外的一條小河邊釣魚。在去年添置了一臺智能手機后揭斧,他學會了在手機上觀...
    Ada_Bleau閱讀 143評論 6 2