Swift 带关联值的枚举

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

但是,有时我们可能希望为枚举值附加额外信息。这些附加到枚举值的额外信息称为关联值

让我们看一个例子,

enum Distance {
  
  // associate value 
  case km(String)
  ...
}

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

现在,我们是这样为枚举值分配关联值的。

Distance.km("Metric System")

这里,"Metric System" 是与 km 值相关联的值。


示例:带关联值的 Swift 枚举

enum Distance {
  
  // associate value
  case km(String)
  case miles(String)
}

// pass string value to km
var dist1 = Distance.km("Metric System")
print(dist1)

// pass string value to miles
var dist2 = Distance.miles("Imperial System")
print(dist2)

输出

km("Metric System")
miles("Imperial System")

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

  • "Metric System" 被分配给 km 值。
  • "Imperial System" 被分配给 miles 值。

关联多个值

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

enum Marks {

 // associate multiple Double values
case gpa(Double, Double, Double)

// associate multiple String values
case grade(String, String, String)
}

// pass three Double values to gpa
var marks1 = Marks.gpa(3.6, 2.9, 3.8)
print(marks1)

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

输出

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

在这里,我们创建了一个包含两个值的枚举:gpagrade。请注意枚举值,

// associate multiple Double values
case gpa(Double, Double, Double)

// associate multiple String values
case grade(String, String, String)

这表明我们需要分别将三个 DoubleString 值与 gpagrade 关联。这些关联值也称为 元组

因此,我们将 3.62.93.8 附加到 gpa

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

然后,我们将 "A""B""C" 附加到 grade

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

命名关联值

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

enum Pizza {

  case small(inches: Int)
}

在这里,我们将名称 inches 提供了给关联值。

在阅读命名关联值时,比以下方式更有意义:

case small(Int)

示例:命名关联值

enum Pizza {

  // named associated value
  case small (inches: Int)
  case medium (inches: Int)
  case large (inches: Int)
}

// pass value using provided names
var pizza1 = Pizza.medium(inches: 12)
print(pizza1)

输出

medium(inches: 12)

在上面的示例中,我们将名称 inches 提供了给关联值。

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

Pizza.medium(inches: 12)

枚举关联值和 Switch 语句

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

enum Mercedes {

 case sedan(height: Double)
 case suv(height: Double)
 case roadster(height: Double)
}

var choice = Mercedes.suv(height: 5.4)

switch(choice) {
 case let .sedan(height):
   print("Height:", height)

 case let .suv(height):
   print("Height:", height)

 case let .roadster(height):
   print("Height:", height)
}

输出

Height: 5.4

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

var choice = Mercedes.suv(height: 5.4)

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

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

case let .suv(height):

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

由于值与 case let .suv 匹配,因此 case 内的语句将被执行。


原始值 VS 关联值

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

enum Vehicle: String {

  case car = "Four Wheeler"
  case bike = "Two Wheeler"
}

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

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

enum Marks {
  
  case grade(String)
  case gpa(Double)
}

这里,gradegpa 分别具有 StringDouble 类型的关联值。

并且我们在创建变量时将关联值分配给枚举值。

var marks = Marks.grade("A")

注意事项:

  1. 一个枚举不能同时具有原始值和关联值。
  2. 枚举的原始值必须是相同的数据类型。但关联值可以是任何类型。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战