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

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

protocol Flashable {}//Can be empty becuase function is in extension

extension Flashable where Self: UIView //Makes this protocol work ONLY if object conforms to UIView (ie. uilable, uibutton, etc.)
{
    func flash() {
        UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
            self.alpha = 1.0 //Object fades in
        }) { (animationComplete) in
            if animationComplete == true {
                UIView.animate(withDuration: 0.3, delay: 2.0, options: .curveEaseOut, animations: {
                    self.alpha = 0.0 //Object fades out
                    }, completion: nil)
            }
        }
    }
}

Какой смысл в расширении? почему бы просто не включить его в первоначальное определение протокола?

2 ответа

почему бы просто не включить его в первоначальное определение протокола

Потому что это не законно. Протокол может включать в себя объявление функции, но не тело функции (реализацию). Расширение протокола включает в себя реализацию по умолчанию. Вот что такое расширение протокола.

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

С Языками Java, .Net Objective C, Вы не можете иметь множественное наследование. Вы должны наследовать от одного класса, а остальные от протоколов. Это означает, что конкретные методы могут быть унаследованы из одного места. Но с расширениями классов это тоже может быть.

Посмотрите на протоколно-ориентированное программирование в Swift 3

Удачного кодирования с POP

Другие вопросы по тегам