跳到主要内容

Swift枚举及其关联值

提示
  1. 关联值概念:Swift 枚举可以附加额外信息作为关联值,允许枚举值存储不同类型的数据,如字符串或数字。
  2. 多关联值和命名:Swift 枚举可关联多个值,并且这些值可以被命名,以提高代码的可读性和意义。
  3. 枚举关联值与 Switch 语句:Swift 中的枚举关联值可以与 switch 语句结合使用,以便基于不同的枚举值执行不同的操作。

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

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

让我们看一个例子,

enum Distance {

// 关联值
case km(String)
...
}

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

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

Distance.km("公制")

这里,"公制" 是与 km 值关联的值。

示例:带有关联值的 Swift 枚举

enum Distance {

// 关联值
case km(String)
case miles(String)
}

// 传递字符串值给 km
var dist1 = Distance.km("公制")
print(dist1)

// 传递字符串值给 miles
var dist2 = Distance.miles("英制")
print(dist2)

输出

km("公制")
miles("英制")

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

  • "公制" 被赋给了 km 值。
  • "英制" 被赋给了 miles 值。

关联多个值

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

enum Marks {

// 关联多个 Double 值
case gpa(Double, Double, Double)

// 关联多个 String 值
case grade(String, String, String)
}

// 传递三个 Double 值给 gpa
var marks1 = Marks.gpa(3.6, 2.9, 3.8)
print(marks1)

// 传递三个字符串值给 grade
var marks2 = Marks.grade("A", "B", "C")
print(marks2)

输出

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

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

// 关联多个 Double 值
case gpa(Double, Double, Double)

// 关联多个 String 值
case grade(String, String, String)

这表明我们必须分别将三个 DoubleString 值关联到 gpagrade。这些关联值也被称为元组

因此,我们将 3.62.93.8 附加到了 gpa

// 传递三个整数值给 gpa
var marks1 = Marks.gpa(3.5, 2.9, 3.8)

而我们将 "A""B""C" 附加到了 grade

// 传递三个字符串值给 grade
var marks2 = Marks.grade("A", "B", "C")

命名关联值

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

enum Pizza {

case small(inches: Int)
}

这里,我们为关联值提供了 inches 这个名字。

使用命名的关联值阅读起来更有意义,而不是

case small(Int)

示例:命名关联值

enum Pizza {

// 命名关联值
case small (inches: Int)
case medium (inches: Int)
case large (inches: Int)
}

// 使用提供的名字传递值
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)

case let .suv(height):
print("高度:", height)

case let .roadster(height):
print("高度:", 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 内的语句。

原始值与关联值

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

enum Vehicle: String {

case car = "四轮车"
case bike = "两轮车"
}

这里,我们为 carbike 分别提供了原始值:"四轮车""两轮车"

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

enum Marks {

case grade(String)
case gpa(Double)
}

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

我们在创建变量时将关联值赋值给枚举值。

var marks = Marks.grade("A")

注意

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