应用于多种类型的协议扩展

Protocol extension to be applied to several types

我有一个协议,例如:

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

您可以将这些类型与另一个 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()