Swift3.1_枚舉

枚舉

定義和使用

使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi),使用case關(guān)鍵字來定義一個新的枚舉成員值。

enum CompassPoint {
    case north
    case south
    case east
    case west
}

使用

let direction: CompassPoint = .north

使用Switch語句匹配枚舉值

case .north:
    print("direction is north")
case .south:
    print("direction is south")
case .east:
    print("direction is east")
case .west:
    print("direction is west")
}

關(guān)聯(lián)值

你可以定義Swift枚舉來存儲任意類型的關(guān)聯(lián)值,如果需要的話,每個枚舉成員的關(guān)聯(lián)值類型可以各不相同。枚舉的這種特性跟其他語言中的可識別聯(lián)合discriminated unions,標簽聯(lián)合tagged unions,或者變體variants相似。

定義一個名為Barcode的枚舉類型,它的一個成員值是具有(Int,Int,Int,Int)類型關(guān)聯(lián)值的upc,另一個成員值是具有String類型關(guān)聯(lián)值的qrCode。

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

然后可以使用任意一種條形碼類型創(chuàng)建新的條形碼,例如:

var productBarcode = Barcode.upc(8, 0085, 2106, 3)

同一個商品可以被分配一個不同類型的條形碼,例如:

productBarcode = Barcode.qrCode("ABCDEFGHIJKLMNOP")

原始值

枚舉成員可以被默認值(稱為原始值)預填充,這些原始值的類型必須相同。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}
原始值的隱式賦值

在使用原始值為整數(shù)或者字符串類型的枚舉時,不需要顯式地為每一個枚舉成員設置原始值,Swift將會自動為你賦值。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Plant.mercury的顯式原始值為1,Planet.venus的隱式原始值為2,依次類推。

使用原始值初始化枚舉實例

如果在定義枚舉類型的時候使用了原始值,那么將會自動獲得一個初始化方法,這個方法接收一個叫做rawValue的參數(shù),參數(shù)類型即為原始值類型,返回值則是枚舉成員或nil。你可以使用這個初始化方法來創(chuàng)建一個新的枚舉實例。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet 類型為 Planet? 值為 Planet.uranus

let impossiblePlanet = Planet(rawValue: 11)
print(impossiblePlanet as Any)  // nil

遞歸枚舉

遞歸枚舉是一種枚舉類型,它有一個或多個枚舉成員使用該枚舉類型的實例作為關(guān)聯(lián)值。使用遞歸枚舉時,編譯器會插入一個間接層。你可以在枚舉成員前加上indirect來表示該成員可遞歸。

例如,下面的例子中,枚舉類型存儲了簡單的算術(shù)表達式:

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

你也可以在枚舉類型開頭加上indirect關(guān)鍵字來表明它的所有成員都是可遞歸的:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

上面定義的枚舉類型可以存儲三種算術(shù)表達式:純數(shù)字、兩個表達式相加、兩個表達式相乘。

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

要操作具有遞歸性質(zhì)的數(shù)據(jù)結(jié)構(gòu),使用遞歸函數(shù)是一種直截了當?shù)姆绞?。例如,下面是一個對算術(shù)表達式求值的函數(shù):

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
print(evaluate(product))
// 打印 "18"

該函數(shù)如果遇到純數(shù)字,就直接返回該數(shù)字的值。如果遇到的是加法或乘法運算,則分別計算左邊表達式和右邊表達式的值,然后相加或相乘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 本章將會介紹 閉包表達式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動閉包枚舉語法使用Switch語句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,629評論 0 3
  • 枚舉為一組相關(guān)的值定義了一個共同的類型,使得可以在代碼中以類型安全的方式來使用這些值。 如果熟悉 C 語言,會知道...
    窮人家的孩紙閱讀 901評論 1 4
  • 枚舉為一組相關(guān)的值定義了一個共同的類型,使你可以在你的代碼中以類型安全的方式來使用這些值。 如果你熟悉 C 語言,...
    雨影閱讀 436評論 0 0
  • 天冷了,又下起了小雨,這個世界顯得更冷了。 不知道你那邊的天氣怎么樣,是不是也是這么冷?是不是也在下著雨? 此刻,...
    向著太陽奔跑的石頭閱讀 562評論 0 0
  • 世界觀:關(guān)于世界的根本看法;人生觀:關(guān)于人生的看法;價值觀:回答在人生當中什么事認為值得或不值得的,以及它的價值大小。
    目標感閱讀 131評論 0 0

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