swift簡單總結(jié)(十八)—— 枚舉

版本記錄

版本號 時間
V1.0 2017.07.28

前言

??我是swift2.0的時候開始接觸的伞辛,記得那時候還不是很穩(wěn)定,公司的項目也都是用oc做的,并不對swift很重視隧甚,我自己學(xué)了一段時間,到現(xiàn)在swift3.0+已經(jīng)出來了渡冻,自己平時也不寫戚扳,忘記的也差不多了,正好項目這段時間已經(jīng)上線了族吻,不是很忙帽借,我就可以每天總結(jié)一點了珠增,希望對自己對大家有所幫助。在總結(jié)的時候我會對比oc進行說明砍艾,有代碼的我會給出相關(guān)比對代碼蒂教。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡單總結(jié)(四)—— 函數(shù)和類
5. swift簡單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡單總結(jié)(六)—— 協(xié)議擴展與泛型
7. swift簡單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡單總結(jié)(八)—— 別名、布爾值與元組
9. swift簡單總結(jié)(九)—— 可選值和斷言
10. swift簡單總結(jié)(十)—— 運算符
11. swift簡單總結(jié)(十一)—— 字符串和字符
12. swift簡單總結(jié)(十二)—— 集合類型之數(shù)組
13. swift簡單總結(jié)(十三)—— 集合類型之字典
14. swift簡單總結(jié)(十四)—— 控制流
15. swift簡單總結(jié)(十五)—— 控制轉(zhuǎn)移語句
16. swift簡單總結(jié)(十六)—— 函數(shù)
17. swift簡單總結(jié)(十七)—— 閉包(Closures)

枚舉

??不知道大家是否還記得在OC中枚舉必須是整型脆荷,但是在swift中對這方面進行了優(yōu)化凝垛,突破了這方面的限制。swift中不必給每一個枚舉成員提供一個值蜓谋,如果一個值被提供給每個枚舉成員梦皮,則該值可以是一個字符串,一個字符桃焕,或者是一個整型值或者浮點值剑肯。

還要說明的是,在swift中枚舉類型是一等類型(first - class)观堂,它們采用了很多傳統(tǒng)上只被類(class)所支持的特征让网。比如:

  • 計算型屬性(computed properties),用于提供關(guān)于枚舉當前值的附加信息型将。
  • 實例方法(instance methods)寂祥,用于提供和枚舉所代表的值相關(guān)聯(lián)的功能。
  • 枚舉也可以定義構(gòu)造函數(shù)(initializers)來提供一個初始成員值七兜。
  • 可以在原始的實現(xiàn)基礎(chǔ)上擴展它們的功能丸凭。
  • 可以遵守協(xié)議(protocols)來提供標準功能。

下面從以下四個方面進行講解:

  • 枚舉語法(Enumeration Syntax)
  • 匹配枚舉值與switch語句(Matching Enumeration Values with a Switch Statement)
  • 相關(guān)值(Associated Values)
  • 原始值(Raw Values)

枚舉語法

下面我們看一個例子腕铸。

enum ComposePoint {
    case North
    case South
    case East
    case West
}

這里要注意:OC中可以給第一個成員賦初始值惜犀,然后下面的成員就會順著一次加1,但是swift中并不會這么做狠裹,這些枚舉成員在ComposePoint的顯示定義中擁有各自不同的值虽界。

這些成員值還可以寫在同一行上,用逗號隔開涛菠。

enum ComposePoint {
    case North, South, East, West
}

再次與OC相比莉御,可見swift更加靈活多變,功能強大俗冻。

將枚舉值賦值給變量或者常量時礁叔,可以按照下例進行。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        //枚舉賦值情況
        var direction = ComposePoint.North
        direction = .West
        
    }
}

匹配枚舉值與switch語句

枚舉值可以和switch語句結(jié)合起來使用迄薄,看下面這個例子琅关。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        //枚舉賦值情況
        var direction = ComposePoint.North
        direction = .West
        
        switch direction {
        case .North:
            print("North")
        case .South:
            print("South")
        case .West:
            print("West")
        case .East:
            print("East")
        }
    }
}

下面看輸出結(jié)果

West

相關(guān)值

如果有時候能夠把其他類型的相關(guān)值和成員值一起存儲起來會很有用,這能讓你存儲成員值之外的自定義信息讥蔽,并且當你每次在代碼中使用該成員時允許這個信息產(chǎn)生變化涣易。swift的枚舉可以存儲任意類型的相關(guān)值画机,如果需要的話,每個成員的數(shù)據(jù)類型可以都是各不相同的新症,枚舉的這種特性和其他語言中的辨識聯(lián)合discriminated unions步氏,標簽聯(lián)合tagged unions變體variants類似账劲。

看下面這個例子戳护。

enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        var productBarCode = Barcode.UPCA(8, 85909_51226, 3)
        productBarCode = .QRCode("ABCDSFRGHJ")
        
        switch productBarCode {
        case .UPCA(let numberSystem, let identify, let check):
            print("UPC-A with value of \(numberSystem), \(identify), \(check)")
        case .QRCode(let productCode):
            print("QR code with value of \(productCode)")
        }
    }
}

下面看輸出結(jié)果

QR code with value of ABCDSFRGHJ

如上金抡,不同的條形碼類型可以使用一個switch語句檢查瀑焦,然而這次相關(guān)值可以被提取坐位switch語句的一部分,你可以在switchcase分支代碼中提取每個相關(guān)值作為一個常量或者作為一個變量來使用梗肝。

如果一個枚舉成員的所有相關(guān)值被提去為常量榛瓮,或者它們?nèi)勘惶崛樽兞浚瑸榱撕啙嵨谆鳎憧梢灾环胖靡粋€var或者let標注在成員名稱前禀晓。具體代碼如下:

switch productBarCode {
case let .UPCA( numberSystem,  identify, check):
    print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case let .QRCode( productCode):
    print("QR code with value of \(productCode)")
}

下面看輸出結(jié)果

QR code with value of ABCDSFRGHJ

這里只是更改了代碼組織結(jié)構(gòu),并沒有改變最后的值坝锰,這里注意粹懒,只有同一個分支里面所有數(shù)據(jù)相關(guān)值類型一樣時,數(shù)據(jù)類型才可以提到最前面顷级。


原始值

在講述相關(guān)值的時候凫乖,一個枚舉成員可以存儲不同類型的相關(guān)值,作為相關(guān)值的替代弓颈,枚舉成員可以被默認值(稱為原始值)預(yù)先填充帽芽,其中這些原始值具有相同的類型。

下面看個簡單例子翔冀。

enum ASCIICharacter : Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

這里导街,ASCIICharacter的枚舉的原始值類型被定義為Character
注意:原始值和相關(guān)值是不相同的纤子,當你開始在你的代碼中定義枚舉的時候原始值是被預(yù)先填充的值搬瑰,像上述三個ASCII值,對于一個特定的枚舉成員控硼,它的原始值始終是相同的泽论,相關(guān)值是當你在創(chuàng)建一個基于枚舉成員的新常量或者變量時才會被設(shè)置,并且每次當你這么做的時候象颖,它的值可以是不同的佩厚。

原始值的類型可以是字符串,字符说订,或者任何整型值或浮點型值抄瓦,每個原始值在它的枚舉聲明中必須是唯一的潮瓶,當整型值被用于原始值,如果其他枚舉成員沒有值時钙姊,它們會自動遞增训唱,最后這一點和OC是一樣的悯姊。

可以通過枚舉成員的屬性rawValue獲取原始值。

下面看這個簡單例子。

enum Planet : Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let earthOrder = Planet.Earth.rawValue
        print(earthOrder)
    }
}

下面看輸出結(jié)果

3

還可以通過參數(shù)為rawValue構(gòu)造函數(shù)創(chuàng)建特定原始值的枚舉炮温,下面看這個例子。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let possiblePlanet = Planet(rawValue: 7)
        print(possiblePlanet)
    }
}

下面看輸出結(jié)果

Optional(JJSwift.Planet.Uranus)

大家可以看見精堕,這個值的類型是可選的绰更,也就是說這個值可能存在也可能不存在,下面我們看一下不存在的例子婚温。

enum Planet : Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let possibleValue = 9
        if let somePlanet = Planet(rawValue: possibleValue) {
            switch somePlanet {
            case .Earth:
                print("Human Home")
            default:
                print("NO Humans")
            }
        }
        else {
            print("There is not a planet at position \(possibleValue)")
        }
    }
}

下面看輸出結(jié)果

There is not a planet at position 9

后記

未完描焰,待續(xù)~~~

ocean
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栅螟,隨后出現(xiàn)的幾起案子荆秦,更是在濱河造成了極大的恐慌,老刑警劉巖力图,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步绸,死亡現(xiàn)場離奇詭異,居然都是意外死亡吃媒,警方通過查閱死者的電腦和手機瓤介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晓折,“玉大人惑朦,你說我怎么就攤上這事±旄牛” “怎么了漾月?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胃珍。 經(jīng)常有香客問我梁肿,道長,這世上最難降的妖魔是什么觅彰? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任吩蔑,我火速辦了婚禮,結(jié)果婚禮上填抬,老公的妹妹穿的比我還像新娘烛芬。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布赘娄。 她就那樣靜靜地躺著仆潮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遣臼。 梳的紋絲不亂的頭發(fā)上性置,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音揍堰,去河邊找鬼鹏浅。 笑死,一個胖子當著我的面吹牛屏歹,可吹牛的內(nèi)容都是我干的隐砸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼西采,長吁一口氣:“原來是場噩夢啊……” “哼凰萨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起械馆,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎武通,沒想到半個月后霹崎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡冶忱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年尾菇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚枪。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡派诬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出链沼,到底是詐尸還是另有隱情默赂,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布括勺,位于F島的核電站缆八,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疾捍。R本人自食惡果不足惜奈辰,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乱豆。 院中可真熱鬧奖恰,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翰守,卻和暖如春孵奶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜡峰。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工了袁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湿颅。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓载绿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親油航。 傳聞我的和親對象是個殘疾皇子崭庸,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容