Swift原始值
原始值(Raw Values)
在Associated Values小節的條形碼例子中演示了一個枚舉的成員如何聲明它們存儲不同類型的相關值。作爲相關值的替代,枚舉成員可以被默認值(稱爲原始值)預先填充,其中這些原始值具有相同的類型。
這裏是一個枚舉成員存儲原始 ASCII 值的例子:
enum ASCIIControlCharacter: Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
在這裏,稱爲ASCIIControlCharacter
的枚舉的原始值類型被定義爲字符型Character
,並被設置了一些比較常見的 ASCII 控制字符。字符值的描述請詳見字符串和字符Strings and Characters
部分。
注意,原始值和相關值是不相同的。當你開始在你的代碼中定義枚舉的時候原始值是被預先填充的值,像上述三個 ASCII 碼。對於一個特定的枚舉成員,它的原始值始終是相同的。相關值是當你在創建一個基於枚舉成員的新常量或變量時纔會被設置,並且每次當你這麼做得時候,它的值可以是不同的。
原始值可以是字符串,字符,或者任何整型值或浮點型值。每個原始值在它的枚舉聲明中必須是唯一的。當整型值被用於原始值,如果其他枚舉成員沒有值時,它們會自動遞增。
下面的枚舉是對之前Planet
這個枚舉的一個細化,利用原始整型值來表示每個 planet 在太陽系中的順序:
enum Planet: Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
自動遞增意味着Planet.Venus
的原始值是2
,依次類推。
使用枚舉成員的toRaw
方法可以訪問該枚舉成員的原始值:
let earthsOrder = Planet.Earth.toRaw()
// earthsOrder is 3
使用枚舉的fromRaw
方法來試圖找到具有特定原始值的枚舉成員。這個例子通過原始值7
識別Uranus
:
let possiblePlanet = Planet.fromRaw(7)
// possiblePlanet is of type Planet? and equals Planet.Uranus
然而,並非所有可能的Int
值都可以找到一個匹配的行星。正因爲如此,fromRaw
方法可以返回一個**可選**的枚舉成員。在上面的例子中,possiblePlanet
是Planet?
類型,或「可選的Planet
」。
如果你試圖尋找一個位置爲9的行星,通過fromRaw
返回的可選Planet
值將是nil
:
let positionToFind = 9
if let somePlanet = Planet.fromRaw(positionToFind) {
switch somePlanet {
case .Earth:
println("Mostly harmless")
default:
println("Not a safe place for humans")
}
} else {
println("There isn't a planet at position \(positionToFind)")
}
// 輸出 "There isn't a planet at position 9
這個範例使用可選綁定(optional binding),通過原始值9
試圖訪問一個行星。if let somePlanet = Planet.fromRaw(9)
語句獲得一個可選Planet
,如果可選Planet
可以被獲得,把somePlanet
設置成該可選Planet
的內容。在這個範例中,無法檢索到位置爲9
的行星,所以else
分支被執行。