ios – Swift中的协议扩展和类扩展

假设有一个协议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年的“我”

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...