我有一个协议,例如:
protocol P {
func foo()
}
可以为某些类型进行默认实现:
extension P where Self == Int {
func foo() {
// do something
}
}
但是如何对几种类型使用相同的默认实现?像这样:
extension P where Self == Int or Self == Float {
func foo() {
// do something
}
}
答案 0 :(得分:3)
您可以将类型与另一个protocol
(例如HasDefaultFoo
)结合在一起。这样,类型就可以决定何时采用协议,是否需要默认实现。
protocol P {
func foo()
}
protocol HasDefaultFoo {
func foo()
}
extension Int: P, HasDefaultFoo { }
extension Float: P, HasDefaultFoo { }
extension P where Self: HasDefaultFoo {
func foo() {
print(self)
}
}
extension Double: P {
func foo() {
print("I provide my own foo()")
}
}
示例:
5.foo()
(5.5 as Float).foo()
5.5.foo()
输出:
5 5.5 I provide my own foo()