From 0a734e697ac96973b7aab8e7c321a3798bbc0e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E5=B0=A7=E5=85=83?= Date: Sun, 21 Oct 2018 21:27:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=20Swift=204.2=20?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E6=96=87=E6=A1=A3=E8=BF=9B=E8=A1=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E3=80=821=20=E6=96=B0=E5=A2=9E=20=E2=80=9C=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E6=88=90=E5=91=98=E7=9A=84=E9=81=8D=E5=8E=86=E2=80=9D?= =?UTF-8?q?=20=E5=B0=8F=E8=8A=82=202=20=E5=AF=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E8=AF=8D=E7=9C=BC=E8=BF=9B=E8=A1=8C=E4=BA=86?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=203=20=E4=BF=AE=E6=AD=A3=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 53 +++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 634748bc..11177f6a 100755 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -68,14 +68,14 @@ directionToHead = .east ```swift directionToHead = .south switch directionToHead { - case .north: - print("Lots of planets have a north") - case .south: - print("Watch out for penguins") - case .east: - print("Where the sun rises") - case .west: - print("Where the skies are blue") +case .north: + print("Lots of planets have a north") +case .south: + print("Watch out for penguins") +case .east: + print("Where the sun rises") +case .west: + print("Where the skies are blue") } // 打印 "Watch out for penguins” ``` @@ -101,10 +101,39 @@ default: // 打印 "Mostly harmless” ``` + +## 枚举成员的遍历 + +在一些情况下,你会需要得到一个包含枚举所有成员的集合。可以通过如下代码实现: + +令枚举遵循 `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)。 + ## 关联值 -上一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候能够把其他类型的*关联值*和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。 +枚举语法那一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候能够把其他类型的*关联值*和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。 你可以定义 Swift 枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的可识别联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。 @@ -170,7 +199,7 @@ case let .upc(numberSystem, manufacturer, product, check): case let .qrCode(productCode): print("QR code: \(productCode).") } -// 输出 "QR code: ABCDEFGHIJKLMNOP." +// 打印 "QR code: ABCDEFGHIJKLMNOP." ``` @@ -240,7 +269,7 @@ let sunsetDirection = CompassPoint.west.rawValue 如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做 `rawValue` 的参数,参数类型即为原始值类型,返回值则是枚举成员或 `nil`。你可以使用这个初始化方法来创建一个新的枚举实例。 -这个例子利用原始值 `7` 创建了枚举成员 `uranus`: +这个例子利用原始值 `7` 创建了枚举成员 `Uranus`: ```swift let possiblePlanet = Planet(rawValue: 7) @@ -267,7 +296,7 @@ if let somePlanet = Planet(rawValue: positionToFind) { } else { 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` 分支被执行。 From 0f428e93f670a4060bd7dcc1900a4fc0a5aa844f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E5=B0=A7=E5=85=83?= Date: Sun, 21 Oct 2018 21:45:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 11177f6a..e7b10810 100755 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -139,11 +139,11 @@ for beverage in Beverage.allCases { 例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有使用 `0` 到 `9` 的数字的 UPC 格式的一维条形码。每一个条形码都有一个代表“数字系统”的数字,该数字后接五位代表“厂商代码”的数字,接下来是五位代表“产品代码”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描: - + 其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO 8859-1 字符,并且可以编码一个最多拥有 2,953 个字符的字符串: - + 这便于库存跟踪系统用包含四个整型值的元组存储 UPC 码,以及用任意长度的字符串储存 QR 码。