假设有一个协议Draggable,通常会被UIView对象所一致
protocol Draggable { drag() }
我们可以在协议扩展中实现drag()作为选项1
// option 1 extension Draggable where Self: UIView { func drag() { // implementation } } extension UIView: Draggable {} // added after @Rich Tolley's answer
或者我们可以在UIView扩展中实现drag()作为选项2
// option 2 extension UIView: Draggable { func drag() { // implementation } }
这是我的问题:
>这两种方法有差异(选项1和选项2)?
>如果是,有什么区别,以及在设计我们的项目或图书馆时如何选择?
而想法会很有帮助.
解决方法
是的,有一个区别:(编辑:或者至少有这个q的原始版本,没有添加扩展名UIView:Draggable {}到选项1的结尾).
>选项1为符合Draggable的UIView实例创建一个默认实现.您仍然需要在声明中标记要符合Draggable的UIViews:类MyView:Draggable.任何符合Draggable但不是UIView子类的内容都需要提供自己的实现.
>选项2扩展了所有UIViews,使其符合Draggable.除了单独的扩展也为这些类编写,或者它们被手动地符合协议之外,没有其他的可以是可拆分的.没有必要在类声明中添加Draggable.
协议扩展通常是更好的选择.在这种情况下,这显然是真的,因为并不是所有的UIView都可以拖拉.另外,下拉协议扩展路由意味着你可以创建一个不是UIView子类的Draggable对象,如果需要的话(可以肯定地是不大可能的,因为大多数Cocoa控件都是UIView子类 – 尽管并不是全部-UIBarButtonItem不是,奇怪)
如果您遵循选项2,则在许多情况下,您将向UIView添加不必要的方法,这是违反良好的面向对象设计(特别是接口隔离原则)(客户端不应被迫依赖于不使用的方法
) – 这是SOLID principles年的“我”