框架之间扩展的Swift协议一致性

时间:2018-02-13 09:04:44

标签: ios swift cocoapods protocols

出于各种原因,我将Swift iOS应用程序的代码库拆分为一系列模块,这些模块主要依赖于相当线性的方式。这个问题的基础是:如果我在一个模块中有一个类,然后将其扩展为符合另一个模块中的协议,那么该类型的所有对象都会自动符合吗?。我们称之为模块1 & 模块2 目前。

这种模块化的结果是,并非给定UITableView类的每个单元都将在同一模块中声明。所以,为了让我能够使用来自该模块的单元格,我已经宣布了一系列描述单元格基本功能的协议。例如:

模块1 中:

public protocol ActionableCell {
    func performAction()
}

tableview使用哪个,所以每次选择一个单元格时,如果它符合ActionableCell,则会调用performAction()。这允许tableview处理它不知道的单元格上的点击。

因此,在tableview的类(模块1 )中:

open class SomeTableView: UITableView {
    // Blah

        open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // If the cell is actionable, inform it that it has been selected
    if let cell = tableView.cellForRow(at: indexPath) as? ActionableCell {
        cell.performAction()
    }
}

但是,有时单元格是在模块1 中声明的,但如果没有一些模块在链条的下方,则无法执行操作,因此在模块1 中我声明了类:

open class SomeCell: UITableViewCell {
}

然后在模块2 中,我使该单元符合ActionableCell

extension SomeCell: ActionableCell {
    func performAction() {
        // Do Stuff
    }
}

所以,只是为了澄清:

在第一个模块中: ActionableCell已声明,SomeTableView已声明,SomeCell已声明,但符合ActionableCell

然后在第二个模块中: SomeCell扩展为符合ActionableCell

如果包含两个模块&在我的项目中构建,但是模块2 不是直接导入到swview文件中的tableview类(执行转换为ActionableCell)或者创建单元格的地方,无论如何,单元格符合ActionableCell,因为扩展是项目的一部分?如果不是,在什么时候导入扩展名很重要?

我知道在不导入第二个模块的情况下无法访问SomeCell的扩展属性,但这是关于是否可以在不导入扩展名的情况下进行转换。

1 个答案:

答案 0 :(得分:1)

我意识到这没有收到任何答案,并且我已经使用了一段时间,所以我认为应该发布答案。

事实证明,类扩展是全局的-如果一个模块扩展了一个类,则由于存在该模块,每个模块都会对其进行扩展。这与是否导入第二个模块(仅在安装第二个模块时)无关。

例如如果模块A 包含类Foo,并且模块B 扩展Foo以符合某些协议(例如Hashable)。如果模块A 然后检查Hashable是否符合,它将发现Foo确实符合并且仅当还存在模块B 时。 / p>