协议扩展将应用于几种类型

时间:2018-07-06 12:58:22

标签: swift protocols swift4 swift-protocols

我有一个协议,例如:

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
    }
}

1 个答案:

答案 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()