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

ios – Swift中的协议扩展和类扩展,第1张

概述假设有一个协议Draggable,通常会被UIView对象所一致 protocol Draggable { drag()} 我们可以在协议扩展中实现drag()作为选项1 // option 1extension Draggable where Self: UIView { func drag() { // implementation }}extension UIVi 假设有一个协议Draggable,通常会被UIVIEw对象所一致
protocol Draggable {  drag()}

我们可以在协议扩展中实现drag()作为选项1

// option 1extension Draggable where Self: UIVIEw {  func drag() {    // implementation  }}extension UIVIEw: Draggable {} // added after @Rich Tolley's answer

或者我们可以在UIVIEw扩展中实现drag()作为选项2

// option 2extension 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 – Swift中的协议扩展和类扩展全部内容,希望文章能够帮你解决ios – Swift中的协议扩展和类扩展所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1110487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存