Почему мы можем предоставить экземпляр переменной в расширениях протоколов? - PullRequest
0 голосов
/ 18 мая 2018

Почему мы можем дать экземпляр переменной в расширениях протокола, в то время как мы не можем дать экземпляр переменной в самом протоколе?

В протоколе я не могу дать переменной новый экземпляр, но когдаЯ делаю расширение из этого протокола, я могу создать новый экземпляр переменной ... и я не знаю, почему я думаю, что расширение протокола будет вести себя как сам протокол, но это не так.в то время как расширение класса ведет себя как сам класс.

Как мы видим на изображении, мы не можем дать экземпляр переменной, но мы можем сделать это в расширении

1 Ответ

0 голосов
/ 18 мая 2018

A protocol объявляет абстрактный интерфейс.Расширение протокола объявляет реализации по умолчанию.

Некоторые языки программирования делают это по-разному (например, Java с ключевым словом default в interface), но это было синтаксическое решение для Swift.

Причина, по которой перенос стандартных реализаций в расширение лучше в Swift, заключается в том, что расширение может иметь ограничения типа, поэтому у вас могут быть разные реализации по умолчанию для разных типов.

Например:

protocol ErrorDisplaying {
    func showError(message: String)
}

extension ErrorDisplaying where Self: UIViewController {
   func showError(message: String) {
     let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
     present(alert, animated: true, completion: nil)
   }
}
...