我正在尝试扩展协议,以便它可以满足其他协议的多个约束。如何调整代码以使其正确?非常感谢。
extension Moveable where Self: Animal && Self: Aged {
public var canMove: Bool { return true }
}
答案 0 :(得分:55)
您可以使用protocol composition:
extension Moveable where Self: protocol<Animal, Aged> {
// ...
}
或者只是一个接一个地添加一致性:
extension Moveable where Self: Animal, Self: Aged {
// ...
}
答案 1 :(得分:29)
截至本文发布时,答案是使用protocol<Animal, Aged>
。
在Swift 3.0中,不推荐使用protocol<Animal, Aged>
。
Swift 3.0中的正确用法是:
extension Moveable where Self: Animal & Aged {
// ...
}
您还可以将协议与typealias
结合使用。当您在多个位置使用协议组合时,这非常有用(避免重复并提高可维护性)。
typealias AgedAnimal = Aged & Animal
extension Moveable where Self: AgedAnimal {
// ...
}
答案 2 :(得分:0)
从Swift 3开始,您可以使用typealias
创建符合多种协议的类型:
typealias AgedAnimal = Animal & Aged
因此您的代码将变为:
extension Moveable where Self: AgedAnimal {
// ...
}
或者这样:
typealias Live = Aged & Moveable
extension Animal where Self: Live {
// ...
}