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

扩展背后的意义是什么?为什么不将它包含在初始协议定义中?

4

2 回答 2

3

为什么不将它包含在初始协议定义中

因为那是不合法的。协议可能包含函数声明,但不包含函数体(实现)。协议扩展是关于包含默认实现的。这就是协议扩展

于 2017-01-14T03:00:31.127 回答
0

就像马特解释的那样,协议应该是这样工作的。除此之外,协议扩展启用了一种全新的编程方式。它被称为面向协议的编程

使用语言 Java、.Net Objective C,您不能拥有多重继承。您应该从一个类继承并从协议中保留。这意味着可以从一个地方继承具体的方法。但是通过类扩展,你也可以拥有它。

看看Swift 3 中的面向协议的编程

快乐的 POP 编码

于 2017-01-14T04:41:45.267 回答