|
4 | 4 |
|
5 | 5 | *枚举*为一组相关的值定义了一个共同的类型,并使你能够以类型安全的方式在代码中使用这些值。
|
6 | 6 |
|
7 |
| -如果你对 C 语言很熟悉,你会知道 C 的枚举将相关的名称分配给一组整数值。不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为*原始*值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。 |
| 7 | +如果你对 C 语言很熟悉,你会知道 C 的枚举将相关的名称分配给一组整数值。Swift 中的枚举更加灵活,不必为每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为*原始*值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。 |
8 | 8 |
|
9 |
| -此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)或变体(variants)。每一个枚举成员都可以有适当类型的关联值。 |
| 9 | +此外,枚举成员可以指定*任意*类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)或变体(variants)。每一个枚举成员都可以有适当类型的关联值。 |
10 | 10 |
|
11 | 11 | 在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类所支持的特性,例如计算属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵循协议(protocols)来提供标准的功能。
|
12 | 12 |
|
@@ -247,7 +247,7 @@ for beverage in Beverage.allCases {
|
247 | 247 |
|
248 | 248 | 在枚举语法那一小节的例子中演示了如何为枚举的成员定义值和类型,你可以将常量或变量设置为 `Planet.earth`,并在赋值之后检查这个值。然而,有时候把其他类型的值与枚举的成员值一起存储起来会很有用。这额外的信息称为*关联值*,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。
|
249 | 249 |
|
250 |
| -你可以定义 Swift 枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的*可识别联合(discriminated unions)*,*标签联合(tagged unions)*,或者*变体(variants)*相似。 |
| 250 | +你可以定义 Swift 枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。枚举的这种特性跟其他语言中的*可识别联合*(discriminated unions),*标签联合*(tagged unions),或者*变体*(variants)相似。 |
251 | 251 |
|
252 | 252 | 例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有使用 `0` 到 `9` 数字的 UPC 格式的一维条形码。每一个条形码都有一个代表数字系统的数字,该数字后接五位代表厂商代码的数字,接下来是五位代表产品代码的数字。最后一个数字是检查位,用来验证代码是否被正确扫描:
|
253 | 253 |
|
@@ -283,7 +283,7 @@ enum Barcode {
|
283 | 283 |
|
284 | 284 | “定义一个名为 `Barcode` 的枚举类型,它的一个成员值是具有 (`Int`,`Int`,`Int`,`Int`) 类型关联值的 `upc`,另一个成员值是具有 `String` 类型关联值的 `qrCode`。”
|
285 | 285 |
|
286 |
| -这个定义不提供任何 `Int` 或 `String` 类型的关联值,它只是定义了,当 `Barcode` 常量和变量等于 `Barcode.upc` 或 `Barcode.qrCode` 时,可以存储的关联值的类型。 |
| 286 | +这个定义不提供任何 `Int` 或 `String` 类型的关联值,它只是定义了当 `Barcode` 常量和变量等于 `Barcode.upc` 或 `Barcode.qrCode` 时可以存储的关联值的*类型*。 |
287 | 287 |
|
288 | 288 | 然后你可以使用任意一种条形码类型创建新的条形码,例如:
|
289 | 289 |
|
@@ -317,7 +317,7 @@ productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
|
317 | 317 |
|
318 | 318 | 这时,原始的 `Barcode.upc` 和其整数关联值被新的 `Barcode.qrCode` 和其字符串关联值所替代。`Barcode` 类型的常量和变量可以存储一个 `.upc` 或者一个 `.qrCode`(连同它们的关联值),但是在同一时间只能存储这两个值中的一个。
|
319 | 319 |
|
320 |
| -你可以使用一个 switch 语句来检查不同的条形码类型,和<doc:Enumerations#Matching-Enumeration-Values-with-a-Switch-Statement>中的例子一样。然而,这一次,关联值可以被提取出来作为 switch 语句的一部分。你可以在 `switch` 的 `case` 分支代码中提取每个关联值作为一个常量(用 `let` 前缀)或者作为一个变量(用 `var` 前缀)来使用: |
| 320 | +你可以使用一个 switch 语句来检查不同的条形码类型,和<doc:Enumerations#使用-Switch-语句匹配枚举值>中的例子一样。然而,这一次,关联值可以被提取出来作为 switch 语句的一部分。你可以在 `switch` 的 `case` 分支代码中提取每个关联值作为一个常量(用 `let` 前缀)或者作为一个变量(用 `var` 前缀)来使用: |
321 | 321 |
|
322 | 322 | ```swift
|
323 | 323 | switch productBarcode {
|
@@ -371,7 +371,7 @@ case let .qrCode(productCode):
|
371 | 371 |
|
372 | 372 | ## 原始值
|
373 | 373 |
|
374 |
| -在<doc:Enumerations#Associated-Values>小节的条形码例子中,演示了如何声明存储不同类型关联值的枚举成员。作为关联值的替代选择,枚举成员可以被默认值(称为*原始值*)预填充,这些原始值的类型必须相同。 |
| 374 | +在<doc:Enumerations#关联值>小节的条形码例子中,演示了如何声明存储不同类型关联值的枚举成员。作为关联值的替代选择,枚举成员可以被默认值(称为*原始值*)预填充,这些原始值的类型必须相同。 |
375 | 375 |
|
376 | 376 | 这是一个使用 ASCII 码作为原始值的枚举:
|
377 | 377 |
|
@@ -448,7 +448,7 @@ enum CompassPoint: String {
|
448 | 448 | ```
|
449 | 449 | -->
|
450 | 450 |
|
451 |
| -上面例子中,`CompassPoint.south` 拥有隐式原始值 `south`,依此类推。 |
| 451 | +上面例子中,`CompassPoint.south` 拥有隐式原始值 `"south"`,依此类推。 |
452 | 452 |
|
453 | 453 | 使用枚举成员的 `rawValue` 属性可以访问该枚举成员的原始值:
|
454 | 454 |
|
@@ -613,7 +613,7 @@ let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.numb
|
613 | 613 | ```
|
614 | 614 | -->
|
615 | 615 |
|
616 |
| -要操作具有递归性质的数据结构,使用递归函数是一种直截了当的方式。。例如,下面是一个对算术表达式求值的函数: |
| 616 | +要操作具有递归性质的数据结构,使用递归函数是一种直截了当的方式。例如,下面是一个对算术表达式求值的函数: |
617 | 617 |
|
618 | 618 | ```swift
|
619 | 619 | func evaluate(_ expression: ArithmeticExpression) -> Int {
|
|
0 commit comments