如何扩展满足多个约束的协议 - Swift 2.0

时间:2015-06-29 21:37:57

标签: protocols swift2

我正在尝试扩展协议,以便它可以满足其他协议的多个约束。如何调整代码以使其正确?非常感谢。

extension Moveable where Self: Animal && Self: Aged {
    public var canMove: Bool { return true }
}

enter image description here

3 个答案:

答案 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 {
    // ...
}