如果在扩展中实现协议方法,是否需要在协议中指定该方法?

4

我喜欢Swift允许你在协议中定义一个方法,然后通过该协议的扩展来实现该方法。但是,特别是在定义协议和扩展在同一范围内且具有相同的访问级别的情况下,你是否需要首先在协议中定义该方法?

考虑以下代码:

public protocol MyProtocol {
    func addThese(a:Int, b:Int) -> Int
}

public extension MyProtocol {
    func addThese(a:Int, b:Int) -> Int{
        return a + b
    }
}

这与这个有何不同之处?

public protocol MyProtocol {
}

public extension MyProtocol {
    func addThese(a:Int, b:Int) -> Int{
        return a + b
    }
}

注意:我特别询问的是在相同作用域内定义协议和扩展的情况。
如果不是这种情况 - 也就是说,扩展在与协议不同的范围内 - 那么只有与扩展在同一范围内的项目才会获得自动实现。这是有道理的。
例如,在模块 A 中:
public protocol MyProtocol {
    func addThese(a:Int, b:Int) -> Int
}

在B模块中
internal extension MyProtocol {
    func addThese(a:Int, b:Int) -> Int{
        return a + b
    }
}

Module B中实现MyProtocol的所有项目都会自动获得addThese的实现,而在不同作用域中实现MyProtocol的项目仍然必须显式满足该协议。

再次强调,这是关于同时定义协议和扩展的问题。是否有必要在协议本身中定义函数,或者这只是良好实践?


糟糕,那删掉了马丁的评论 :/ 这是他链接到的博客文章: https://oleb.net/blog/2016/06/kevin-ballard-swift-dispatch/ - Hamish
1个回答

1
您无需在协议中定义方法,只需使用扩展即可向协议添加方法,就像您所说的那样,我已经做过很多次。我认为这是一种方便的方式,可以为已符合协议的类提供一些继承。
实际上,您甚至可以扩展原生协议,例如UITableViewDataSourceUITableViewDelegate。例如,您可能希望处理表视图的所有视图控制器都能够访问一个便捷的方法。
但是,对于自己的协议,我建议将这些扩展保留在与协议声明相同的文件中,以更好地跟踪与协议相关的所有内容。
如果仍然有疑问,您可以阅读文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

扩展为现有的类、结构体、枚举或协议类型添加新功能

因此,我不认为这是不良做法,您只是在添加新功能

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接