在 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")
注意事项:
- 一个枚举不能同时具有原始值和关联值。
- 枚举的原始值必须是相同的数据类型。但关联值可以是任何类型。