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

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.07.28

前言

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

枚舉

??不知道大家是否還記得在OC中枚舉必須是整型,但是在swift中對(duì)這方面進(jìn)行了優(yōu)化,突破了這方面的限制。swift中不必給每一個(gè)枚舉成員提供一個(gè)值,如果一個(gè)值被提供給每個(gè)枚舉成員,則該值可以是一個(gè)字符串,一個(gè)字符,或者是一個(gè)整型值或者浮點(diǎn)值。

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

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

下面從以下四個(gè)方面進(jìn)行講解:

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

枚舉語(yǔ)法

下面我們看一個(gè)例子。

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

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

這些成員值還可以寫(xiě)在同一行上,用逗號(hào)隔開(kāi)。

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

再次與OC相比,可見(jiàn)swift更加靈活多變,功能強(qiáng)大。

將枚舉值賦值給變量或者常量時(shí),可以按照下例進(jìn)行。

class JJSwiftVC: UIViewController
{

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

匹配枚舉值與switch語(yǔ)句

枚舉值可以和switch語(yǔ)句結(jié)合起來(lái)使用,看下面這個(gè)例子。

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)值

如果有時(shí)候能夠把其他類(lèi)型的相關(guān)值和成員值一起存儲(chǔ)起來(lái)會(huì)很有用,這能讓你存儲(chǔ)成員值之外的自定義信息,并且當(dāng)你每次在代碼中使用該成員時(shí)允許這個(gè)信息產(chǎn)生變化。swift的枚舉可以存儲(chǔ)任意類(lèi)型的相關(guān)值,如果需要的話(huà),每個(gè)成員的數(shù)據(jù)類(lèi)型可以都是各不相同的,枚舉的這種特性和其他語(yǔ)言中的辨識(shí)聯(lián)合discriminated unions標(biāo)簽聯(lián)合tagged unions ,變體variants類(lèi)似。

看下面這個(gè)例子。

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

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

如果一個(gè)枚舉成員的所有相關(guān)值被提去為常量,或者它們?nèi)勘惶崛樽兞?,為了?jiǎn)潔,你可以只放置一個(gè)var或者let標(biāo)注在成員名稱(chēng)前。具體代碼如下:

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),并沒(méi)有改變最后的值,這里注意,只有同一個(gè)分支里面所有數(shù)據(jù)相關(guān)值類(lèi)型一樣時(shí),數(shù)據(jù)類(lèi)型才可以提到最前面。


原始值

在講述相關(guān)值的時(shí)候,一個(gè)枚舉成員可以存儲(chǔ)不同類(lèi)型的相關(guān)值,作為相關(guān)值的替代,枚舉成員可以被默認(rèn)值(稱(chēng)為原始值)預(yù)先填充,其中這些原始值具有相同的類(lèi)型。

下面看個(gè)簡(jiǎn)單例子。

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

這里,ASCIICharacter的枚舉的原始值類(lèi)型被定義為Character
注意:原始值和相關(guān)值是不相同的,當(dāng)你開(kāi)始在你的代碼中定義枚舉的時(shí)候原始值是被預(yù)先填充的值,像上述三個(gè)ASCII值,對(duì)于一個(gè)特定的枚舉成員,它的原始值始終是相同的,相關(guān)值是當(dāng)你在創(chuàng)建一個(gè)基于枚舉成員的新常量或者變量時(shí)才會(huì)被設(shè)置,并且每次當(dāng)你這么做的時(shí)候,它的值可以是不同的。

原始值的類(lèi)型可以是字符串,字符,或者任何整型值或浮點(diǎn)型值,每個(gè)原始值在它的枚舉聲明中必須是唯一的,當(dāng)整型值被用于原始值,如果其他枚舉成員沒(méi)有值時(shí),它們會(huì)自動(dòng)遞增,最后這一點(diǎn)和OC是一樣的。

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

下面看這個(gè)簡(jiǎn)單例子。

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

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

class JJSwiftVC: UIViewController
{

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

下面看輸出結(jié)果

Optional(JJSwift.Planet.Uranus)

大家可以看見(jiàn),這個(gè)值的類(lèi)型是可選的,也就是說(shuō)這個(gè)值可能存在也可能不存在,下面我們看一下不存在的例子。

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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容