比如这样一种情况:在一个协议A中,使用了另一个协议B作为函数参数,但是继承了另一个协议B的类型有很多,假设某个类签订了协议A,但是对于协议B参数,签订协议B的实际类型中有些支持,有些不支持,那么就要去运行期判断了,比如:
protocol Food {}
protocol Animal {
func eat(_ food: Food)
}
签订Food协议的有:
struct Meat: Food {}
struct Grass: Food {}
签订Animal协议的有
struct Tiger: Animal {
func eat(_ food: Food) {
// 因为老虎只吃肉,不吃蔬菜
if let meat = food as? Meat {
print("吃肉:\(meat)")
} else {
print("不吃蔬菜:\(food)")
}
}
}
像上面这种情况,它是需要去运行期通过 as? 判断的
associatedtype 它可以声明协议中使用的类型,需要签订协议的类,重新用 typealias 定义,这样,实际的使用方就可以根据自己的需求来使用
protocol Animal {
associatedtype F
func eat(_ food: F)
}
struct Tiger: Animal {
typealias F = Meat
func eat(_ food: Meat) {
print("只吃肉:\(food)")
}
}
这样在编译期就可以确定参数类型