【问题标题】:If implementing a protocol method in an extension, do you need to specify the method in the protocol? [duplicate]如果在扩展中实现协议方法,是否需要在协议中指定方法? [复制]
【发布时间】:2018-01-10 18:03:07
【问题描述】:

我喜欢 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 的项目仍必须明确满足协议。

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

【问题讨论】:

标签: swift protocols swift-protocols swift-extensions


【解决方案1】:

您不需要在协议中定义方法,您可以使用扩展将方法添加到协议中,就像您说的那样,我已经做过很多次了。我认为这是一种方便的方式,可以为已经符合协议的类提供一些继承。

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

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

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

扩展为现有的类、结构、 枚举,或协议类型

所以我不认为这是不好的做法,您只是在添加新功能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多