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中的协议扩展和类扩展所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)