枚舉
定義和使用
使用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ù)字的值。如果遇到的是加法或乘法運算,則分別計算左邊表達式和右邊表達式的值,然后相加或相乘。