我试图提供一个协议的默认实现,这样它就可以满足来自其他协议的多个约束。
给定以下协议:
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 }
}
但是我如何设置约束来为同时符合Animal
和Aged
协议的类型提供一个默认的Moveable
实现呢?
// Pseudocode which doesn't work
extension Moveable where Self: Animal && Self: Aged {
public var canMove: Bool { return true }
}
4条答案
按热度按时间fiei3ece1#
您可以使用protocol composition:
或者,您也可以一个接一个地添加符合性:
pxiryf3j2#
到本文发表时为止,答案是使用
protocol<Animal, Aged>
。在Swift 3.0中,
protocol<Animal, Aged>
已被弃用。Swift 3.0中的正确用法是:
您也可以使用
typealias
组合协议。当您在多个位置使用协议组合时,这很有用(避免重复并提高可维护性)。tnkciper3#
从Swift 3开始,您可以使用
typealias
创建符合多个协议的类型:因此,您的代码将变为:
还是这样:
dly7yett4#
使协议成为引用类型