Расширение протокола для нескольких типов - PullRequest
0 голосов
/ 06 июля 2018

У меня есть протокол, например:

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 голосов
/ 06 июля 2018

Вы можете объединить типы с другим 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()
...