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

时间:2018-01-10 18:03:08

标签: swift protocols swift-protocols swift-extensions

我喜欢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
    }
}

模块B中实现MyProtocol的所有项目将自动获得addThese的实现,而在不同范围内实现MyProtocol的项目仍然必须明确满足协议。

同样,这特别是围绕定义协议和扩展。是否需要在协议本身中定义函数,还是仅仅考虑好的做法?

1 个答案:

答案 0 :(得分:1)

您不需要在协议中定义方法,您可以像使用扩展程序一样使用扩展程序向协议添加方法,我已多次完成此操作。我认为这是一种方便的方法,可以为已经符合协议的类提供一些继承。

实际上,您甚至可以扩展本机协议,例如UITableViewDataSourceUITableViewDelegate。例如,您可能希望处理表视图的所有视图控制器都可以访问一个方便的方法。

但是,对于您自己的协议,我建议将这些扩展保存在与协议声明相同的文件中,以便更好地跟踪与协议相关的所有内容。

如果仍有疑问,可以阅读文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

  

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

所以我不相信这是不好的做法,你只是添加新功能