Swift中associatedtype的作用

503 阅读1分钟

比如这样一种情况:在一个协议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)")
	}
}

这样在编译期就可以确定参数类型