为什么不直接扩展UIView或UIViewController?

时间:2017-01-17 20:37:16

标签: swift protocols swift-extensions protocol-oriented

我看到了question这个代码:

protocol Flashable {}

extension Flashable where Self: UIView 
{
    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)
            }
        }
    }
}

我想知道你为什么不直接延长UIView?或者在类似情况下延伸UIViewController为什么要用where Self:

扭转它
  • 是否我们增加了我们的意图,当其他开发者来时,他们会看到这个类符合Flashable,Dimmable等?
  • 我们的UIView还有单独的有意义的扩展吗?而不是UIView或UIViewController的不同unNamed扩展?
  • 针对POP,此主题是否有任何特定的Apple指南?我已经看到开发人员这样做,但不知道为什么......

1 个答案:

答案 0 :(得分:6)

这种方法比直接使用UIView更好,如

extension UIView {
    func flash() {
        ...
    }
}

因为它允许程序员决定他们希望制作UIView个子类Flashable,而不是向所有flash添加UIView功能“批发”:

// This class has flashing functionality
class MyViewWithFlashing : UIView, Flashable {
    ...
}
// This class does not have flashing functionality
class MyView : UIView {
    ...
}

基本上,这是一种“选择加入”的方法,而另一种方法强制实现功能而无法“选择退出”。