在 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")
在这里,我们创建了一个包含两个值的枚举:gpa 和 grade。请注意枚举值,
// associate multiple Double values
case gpa(Double, Double, Double)
// associate multiple String values
case grade(String, String, String)
这表明我们需要分别将三个 Double 和 String 值与 gpa 和 grade 关联。这些关联值也称为 元组。
因此,我们将 3.6、2.9、3.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"
}
在这里,我们分别为 car 和 bike 提供了原始值:"Four Wheeler" 和 "Two Wheeler"。
但是,关联值更像是与枚举值关联的变量。例如:
enum Marks {
case grade(String)
case gpa(Double)
}
这里,grade 和 gpa 分别具有 String 和 Double 类型的关联值。
并且我们在创建变量时将关联值分配给枚举值。
var marks = Marks.grade("A")
注意事项:
- 一个枚举不能同时具有原始值和关联值。
- 枚举的原始值必须是相同的数据类型。但关联值可以是任何类型。