发布于 2015-06-14 01:53:27 | 95 次阅读 | 评论: 0 | 来源: 网络整理
在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
分支被执行。