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

nsc4cvqm  于 2022-11-23  发布在  Swift
关注(0)|答案(4)|浏览(217)

我试图提供一个协议的默认实现,这样它就可以满足来自其他协议的多个约束。
给定以下协议:

public protocol Creature {
    var name: String { get }
    var canMove: Bool { get }
}

public protocol Animal: Creature {}

public protocol Moveable {
    var movingSpeed: Double { get set }
}

public protocol Agend {
    var aged: Int { get }
}

我可以在Self上使用单个条件进行扩展:

// all animals can move
extension Moveable where Self: Animal {
    public var canMove: Bool { return true }
}

但是我如何设置约束来为同时符合AnimalAged协议的类型提供一个默认的Moveable实现呢?

// Pseudocode which doesn't work
extension Moveable where Self: Animal && Self: Aged {
    public var canMove: Bool { return true }
}
fiei3ece

fiei3ece1#

您可以使用protocol composition

extension Moveable where Self: protocol<Animal, Aged> {
    // ... 
}

或者,您也可以一个接一个地添加符合性:

extension Moveable where Self: Animal, Self: Aged {
    // ... 
}
pxiryf3j

pxiryf3j2#

到本文发表时为止,答案是使用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 {
    // ... 
}
tnkciper

tnkciper3#

从Swift 3开始,您可以使用typealias创建符合多个协议的类型:

typealias AgedAnimal = Animal & Aged

因此,您的代码将变为:

extension Moveable where Self: AgedAnimal {
    // ...
}

还是这样:

typealias Live = Aged & Moveable

extension Animal where Self: Live {
    // ...
}
dly7yett

dly7yett4#

使协议成为引用类型

extension Moveable: AnyObject {}

相关问题