Swift 关联类型(associatedtype)的使用

定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过 associatedtype 关键字指定。

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
protocol Eat {
associatedtype FoodType
func eat(_ food: FoodType) -> FoodType
}

protocol Food {
var weight: CGFloat { get set }
var desc: String { get set }
}

struct Meat: Food {
var weight: CGFloat
var desc: String
}

struct Vegetable: Food {
var weight: CGFloat
var desc: String
}

struct Person<T>: Eat {
func eat(_ food: Food) -> Food {
return food
}
}

我们定义了一个 Person,它每天都得吃饭,我们要求它遵循吃饭的协议 Eat,并实现了其中的 eat 方法。在协议 Eat 中我们声明了一个关联类型 FoodType。当 Person 的实例去调用 eat 方法时,我们使用泛型类型去指定之前的占位符 FoodType,那么我们就能清晰地知道 Person 的实例到底吃的是什么。

1
2
3
4
5
6
7
8
9
let p = Person<Food>()

let food1 = p.eat(Meat(weight: 1.2, desc: "meat"))
print("eat \(food1.desc), weight \(food1.weight)")
// eat meat, weight 1.2

let food2 = p.eat(Vegetable(weight: 0.8, desc: "meat"))
print("eat \(food2.desc), weight \(food2.weight)")
// eat meat, weight 0.8
您的支持将鼓励我继续创作!
0%