我用这段代码看到了这个问题:
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
为什么用a扭转它where Self:
是这样我们增加了意图,当其他开发人员来时,他们会看到这个类符合Flashable,Dimmable等吗?
我们的UIView还有单独的有意义的扩展吗?而不是UIView或UIViewController的不同unNamed扩展?
POP有关于此主题的特定Apple指南吗?我见过开发人员这样做,但不知道为什么......
dasblinkenli.. 6
这种方法比UIView
直接使用更好,如
extension UIView { func flash() { ... } }
因为它允许程序员决定UIView
他们希望制作哪些子类Flashable
,而不是flash
向所有UIView
s 添加"批发"功能:
// This class has flashing functionality class MyViewWithFlashing : UIView, Flashable { ... } // This class does not have flashing functionality class MyView : UIView { ... }
从本质上讲,这是一种"选择加入"方法,而替代方法强制实现功能而无法"选择退出".
这种方法比UIView
直接使用更好,如
extension UIView { func flash() { ... } }
因为它允许程序员决定UIView
他们希望制作哪些子类Flashable
,而不是flash
向所有UIView
s 添加"批发"功能:
// This class has flashing functionality class MyViewWithFlashing : UIView, Flashable { ... } // This class does not have flashing functionality class MyView : UIView { ... }
从本质上讲,这是一种"选择加入"方法,而替代方法强制实现功能而无法"选择退出".