Как я могу "явно" реализовать протокол в Swift? Если это невозможно, почему?

В C# есть замечательная языковая функция, называемая "явной реализацией интерфейса", которая позволяет вам реализовать два или более интерфейсов, где имена методов интерфейсов конфликтуют. Он также может заставить метод делать одну вещь, когда вы вызываете его, используя объект включающего типа, и делать другую вещь, когда вы приводите его к типу интерфейса, а затем вызываете метод. Мне интересно, есть ли такая вещь в Swift. Это противоречит какой-либо из идеологий Свифта?

В основном я хочу сделать что-то вроде этого:

struct Job: CustomStringConvertible {
    var location: String
    var description: String
    var CustomStringConvertible.description: String {
        return "Work Location: \(self.location), description: \(self.description)"
    }
}

Job(location: "Foo", description: "Bar").description // "Bar"
(Job(location: "Foo", description: "Bar") as CustomStringConvertible).description // "Work Location: Foo, description: Bar"

Я нашел это в Интернете, но я не думаю, что это уместно, потому что похоже, что оно заставляет переопределять метод в дочерних классах.

1 ответ

Решение

Расширения протокола в основном уже делают то, что вы описываете:

protocol Cat {
}
extension Cat {
    func quack() {
        print("meow")
    }
}
class Duck : Cat {
    func quack() {
        print("quack")
    }
}
let d = Duck()
d.quack() // quack
(d as Cat).quack() // meow
Другие вопросы по тегам