3

我看到了这个问题,代码如下:

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 的不同未命名扩展?
  • 是否有任何针对 POP 的特定 Apple 指南?我见过有开发人员这样做,但不知道为什么......
4

1 回答 1

7

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

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

因为它让程序员决定UIView他们希望创建哪些子类,而不是向所有sFlashable添加flash功能“批发” :UIView

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

本质上,这是一种“选择加入”的方法,而替代方法强制功能没有“选择退出”的方式。

于 2017-01-17T20:45:22.047 回答