Merge pull request #898 from chenmingbiao/gh-pages

feature:Swift5-Enumerations
This commit is contained in:
Jie Liang
2019-03-26 13:51:46 -05:00
committed by GitHub

View File

@ -2,7 +2,7 @@
*枚举*为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。
如果你熟悉 C 语言,你会知道在 C 语言中枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。
如果你熟悉 C 语言,你会知道在 C 语言中枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。
此外,枚举成员可以指定*任意*类型的关联值存储到枚举成员中就像其他语言中的联合体unions和变体variants。你可以在一个枚举中定义一组相关的枚举成员每一个枚举成员都可以有适当类型的关联值。
@ -46,7 +46,7 @@ enum Planet {
}
```
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如 `CompassPoint``Planet`应该以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于:
每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如 `CompassPoint``Planet`)以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于:
```swift
var directionToHead = CompassPoint.west
@ -133,11 +133,11 @@ for beverage in Beverage.allCases {
<a name="associated_values"></a>
## 关联值
枚举语法那一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候能够把其他类型的*关联值*和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。
枚举语法那一小节的例子演示了如何定义和分类枚举的成员。你可以为 `Planet.earth` 设置一个常量或者变量,并在赋值之后查看这个值。然而,有时候把其他类型的和成员值一起存储起来会很有用。这额外的信息称为*关联值*,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。
你可以定义 Swift 枚举来存储任意类型的关联值如果需要的话每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的可识别联合discriminated unions标签联合tagged unions或者变体variants相似。
例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有使用 `0``9` 的数字的 UPC 格式的一维条形码。每一个条形码都有一个代表数字系统的数字,该数字后接五位代表厂商代码的数字,接下来是五位代表“产品代码”的数字。最后一个数字是检查位,用来验证代码是否被正确扫描:
例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有使用 `0``9` 的数字的 UPC 格式的一维条形码。每一个条形码都有一个代表数字系统的数字,该数字后接五位代表厂商代码的数字,接下来是五位代表“产品代码”的数字。最后一个数字是检查位,用来验证代码是否被正确扫描:
<img width="252" height="120" alt="" src="https://docs.swift.org/swift-book/_images/barcode_UPC_2x.png">
@ -162,7 +162,7 @@ enum Barcode {
这个定义不提供任何 `Int``String` 类型的关联值,它只是定义了,当 `Barcode` 常量和变量等于 `Barcode.upc``Barcode.qrCode` 时,可以存储的关联值的类型。
然后可以使用任意一种条形码类型创建新的条形码,例如:
然后可以使用任意一种条形码类型创建新的条形码,例如:
```swift
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
@ -178,7 +178,7 @@ productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
这时,原始的 `Barcode.upc` 和其整数关联值被新的 `Barcode.qrCode` 和其字符串关联值所替代。`Barcode` 类型的常量和变量可以存储一个 `.upc` 或者一个 `.qrCode`(连同它们的关联值),但是在同一时间只能存储这两个值中的一个。
像先前那样,可以使用一个 switch 语句来检查不同的条形码类型。然而,这一次,关联值可以被提取出来作为 switch 语句的一部分。你可以在 `switch` 的 case 分支代码中提取每个关联值作为一个常量(用 `let` 前缀)或者作为一个变量(用 `var` 前缀)来使用:
可以使用一个 switch 语句来检查不同的条形码类型,和之前使用 Switch 语句来匹配枚举值的例子一样。然而,这一次,关联值可以被提取出来作为 switch 语句的一部分。你可以在 `switch` 的 case 分支代码中提取每个关联值作为一个常量(用 `let` 前缀)或者作为一个变量(用 `var` 前缀)来使用:
```swift
switch productBarcode {