Swift 枚举关联值

在本教程中,我们将借助实例学习 Swift 枚举中的关联值。

Swift 枚举 中,我们学习了如何定义具有一组固定相关值的数据类型。

然而,有时我们可能需要将附加信息附加到枚举值。附加到枚举值的这些附加信息称为关联值。

让我们看一个例子,

  1. enum Distance {
  2. // associate value
  3. case km(String)
  4. ...
  5. }

这里,(String)是附加到值 km 的附加信息。它表示 km 的值只能是 String

现在,我们将如何将关联值赋给枚举值。

实例:枚举关联值
  1. enum Distance {
  2. // associate value
  3. case km(String)
  4. case miles(String)
  5. }
  6. // pass string value to km
  7. var dist1 = Distance.km("Metric System")
  8. print(dist1)
  9. // pass string value to miles
  10. var dist2 = Distance.miles("Imperial System")
  11. print(dist2)

结果如下:

  1. km("Metric System")
  2. miles("Imperial System")

在上面的实例中,我们创建了一个名为 Distance 的枚举,该枚举具有以下关联值:

  • "Metric System" 赋值给 km 值
  • "Imperial System" 赋值给 miles 值

关联多个值

在 Swift 中,我们还可以将多个值与单个枚举值相关联。例如,

  1. enum Marks {
  2. // associate multiple Double values
  3. case gpa(Double, Double, Double)
  4. // associate multiple String values
  5. case grade(String, String, String)
  6. }
  7. // pass three Double values to gpa
  8. var marks1 = Marks.gpa(3.6, 2.9, 3.8)
  9. print(marks1)
  10. // pass three string values to grade
  11. var marks2 = Marks.grade("A", "B", "C")
  12. print(marks2)

结果如下:

  1. gpa(3.6, 2.9, 3.8)
  2. grade("A", "B", "C")

这里,我们创建了一个具有两个值的枚举:gpagrade。注意枚举值,

  1. // associate multiple Double values
  2. case gpa(Double, Double, Double)
  3. // associate multiple String values
  4. case grade(String, String, String)

这表明我们必须将 3 个 DoubleString 值分别与 gpagrade 相关联。这些关联值也称为 元组

因此,我们将 3.6、2.9、3.8 附加到 gpa

  1. // pass three integer values to gpa
  2. var marks1 = Marks.gpa(3.5, 2.9, 3.8)

并且,我们在 grade 上附加了 "A"、"B"、"C"。

  1. // pass three string values to grade
  2. var marks2 = Marks.grade("A", "B", "C")

命名关联值

在 Swift 中,我们还可以为关联值提供一个名称,以使代码更具可读性。例如,

  1. enum Pizza {
  2. case small(inches: Int)
  3. }

在这里,我们为关联值提供了名称 inches

当读取指定的关联值而不是

  1. case small(Int)
实例:命名关联值
  1. enum Pizza {
  2. // named associated value
  3. case small (inches: Int)
  4. case medium (inches: Int)
  5. case large (inches: Int)
  6. }
  7. // pass value using provided names
  8. var pizza1 = Pizza.medium(inches: 12)
  9. print(pizza1)

结果如下:

  1. medium(inches: 12)

在上面的实例中,我们为关联的值提供了名称 inches

在向 case 传递关联值时,我们使用了提供的名称,

  1. Pizza.medium(inches: 12)

枚举关联值和 Switch 语句

我们可以使用 Swift switch 语句 来匹配枚举关联的值。例如,

  1. enum Mercedes {
  2. case sedan(height: Double)
  3. case suv(height: Double)
  4. case roadster(height: Double)
  5. }
  6. var choice = Mercedes.suv(height: 5.4)
  7. switch(choice) {
  8. case let .sedan(height):
  9. print("Height:", height)
  10. case let .suv(height):
  11. print("Height:", height)
  12. case let .roadster(height):
  13. print("Height:", height)
  14. }

结果如下:

  1. Height: 5.4

在上面的实例中,我们使用 switch 语句来匹配枚举关联的值。请注意这句,

  1. var choice = Mercedes.suv(height: 5.4)

在这里,我们将 5.4 附加到 suv,并将其赋值给枚举变量 choice

然后,我们在 switch 语句中使用 choice 来比较枚举 case 和每个 case 语句的值。请注意 switch case 语句,

  1. case let .suv(height):

这里,让我们将关联的值绑定到 height 变量,我们可以在 case 主体中使用它。

由于该值与 case-let.suv 匹配,因此执行 case 中的语句。


原始值与关联值

在 Swift 中,原始值是提供给每个枚举值的预定义常量值。例如,

  1. enum Vehicle: String {
  2. case car = "Four Wheeler"
  3. case bike = "Two Wheeler"
  4. }

在这里,我们分别为 carbike 提供了原始值:"Four Wheeler" 和 "Two Wheeler"。

然而,关联的值更像是与枚举值关联的变量。例如,

  1. var marks = Marks.grade("A")

注意

  • 枚举不能同时具有原始值和关联值。
  • 枚举的原始值必须具有相同的数据类型。但关联值可以是任何类型。

分类导航