2017-01-14 12 views
1

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

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

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

ответ

3

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

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

+0

ну почему не просто расширить UIView? Я имею в виду, что мы на самом деле в конечном итоге расширяем UIView? – Honey

+0

@Honey Это хороший вопрос, но это не то, о чем спрашивал ОП. Не меняйте тему. – matt

+0

Я следую своему вопросу, можно найти [здесь] (http://stackoverflow.com/questions/41706504/why-should-not-directly-extend-uiview-or-uiviewcontroller) – Honey

0

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

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

Есть взгляд на Protocol-Oriented Programming in Swift 3

Счастливый кодирования с POP