根据 Swift 4.2 官方文档进行修改。1 新增 “枚举成员的遍历” 小节 2 对一些翻译词眼进行了统一 3 修正了一些格式问题

This commit is contained in:
郑尧元
2018-10-21 21:27:50 +08:00
parent 517a9fdb05
commit 0a734e697a

View File

@ -68,14 +68,14 @@ directionToHead = .east
```swift ```swift
directionToHead = .south directionToHead = .south
switch directionToHead { switch directionToHead {
case .north: case .north:
print("Lots of planets have a north") print("Lots of planets have a north")
case .south: case .south:
print("Watch out for penguins") print("Watch out for penguins")
case .east: case .east:
print("Where the sun rises") print("Where the sun rises")
case .west: case .west:
print("Where the skies are blue") print("Where the skies are blue")
} }
// 打印 "Watch out for penguins” // 打印 "Watch out for penguins”
``` ```
@ -101,10 +101,39 @@ default:
// 打印 "Mostly harmless” // 打印 "Mostly harmless”
``` ```
<a name="iterating over enumeration cases"></a>
## 枚举成员的遍历
在一些情况下,你会需要得到一个包含枚举所有成员的集合。可以通过如下代码实现:
令枚举遵循 `CaseIterable` 协议。Swift 会生成一个 `allCases` 属性,用于表示一个包含枚举所有成员的集合。下面是一个例子:
```swift
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// 打印 "3 beverages available"
```
在前面的例子中,通过 `Beverage.allCases` 可以访问到包含 `Beverage` 枚举所有成员的集合。`allCases` 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 `Beverage` 值。在前面的例子中,统计了总共有多少个枚举成员。而在下面的例子中,则使用 `for` 循环来遍历所有枚举成员。
```swift
for beverage in Beverage.allCases {
print(beverage)
}
// coffee
// tea
// juice
```
在前面的例子中,使用的语法表明这个枚举遵循 [CaseIterable](https://developer.apple.com/documentation/swift/caseiterable) 协议。想了解 protocols 相关信息,请参见[协议](./21_Protocols.html)。
<a name="associated_values"></a> <a name="associated_values"></a>
## 关联值 ## 关联值
一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候能够把其他类型的*关联值*和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。 枚举语法那一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候能够把其他类型的*关联值*和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。
你可以定义 Swift 枚举来存储任意类型的关联值如果需要的话每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的可识别联合discriminated unions标签联合tagged unions或者变体variants相似。 你可以定义 Swift 枚举来存储任意类型的关联值如果需要的话每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的可识别联合discriminated unions标签联合tagged unions或者变体variants相似。
@ -170,7 +199,7 @@ case let .upc(numberSystem, manufacturer, product, check):
case let .qrCode(productCode): case let .qrCode(productCode):
print("QR code: \(productCode).") print("QR code: \(productCode).")
} }
// 输出 "QR code: ABCDEFGHIJKLMNOP." // 打印 "QR code: ABCDEFGHIJKLMNOP."
``` ```
<a name="raw_values"></a> <a name="raw_values"></a>
@ -240,7 +269,7 @@ let sunsetDirection = CompassPoint.west.rawValue
如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做 `rawValue` 的参数,参数类型即为原始值类型,返回值则是枚举成员或 `nil`。你可以使用这个初始化方法来创建一个新的枚举实例。 如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做 `rawValue` 的参数,参数类型即为原始值类型,返回值则是枚举成员或 `nil`。你可以使用这个初始化方法来创建一个新的枚举实例。
这个例子利用原始值 `7` 创建了枚举成员 `uranus` 这个例子利用原始值 `7` 创建了枚举成员 `Uranus`
```swift ```swift
let possiblePlanet = Planet(rawValue: 7) let possiblePlanet = Planet(rawValue: 7)
@ -267,7 +296,7 @@ if let somePlanet = Planet(rawValue: positionToFind) {
} else { } else {
print("There isn't a planet at position \(positionToFind)") print("There isn't a planet at position \(positionToFind)")
} }
// 输出 "There isn't a planet at position 11 // 打印 "There isn't a planet at position 11"
``` ```
这个例子使用了可选绑定optional binding试图通过原始值 `11` 来访问一个行星。`if let somePlanet = Planet(rawValue: 11)` 语句创建了一个可选 `Planet`,如果可选 `Planet` 的值存在,就会赋值给 `somePlanet`。在这个例子中,无法检索到位置为 `11` 的行星,所以 `else` 分支被执行。 这个例子使用了可选绑定optional binding试图通过原始值 `11` 来访问一个行星。`if let somePlanet = Planet(rawValue: 11)` 语句创建了一个可选 `Planet`,如果可选 `Planet` 的值存在,就会赋值给 `somePlanet`。在这个例子中,无法检索到位置为 `11` 的行星,所以 `else` 分支被执行。