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
分支被執行。