出于各种原因,我将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
的扩展属性,但这是关于是否可以在不导入扩展名的情况下进行转换。
答案 0 :(得分:1)
我意识到这没有收到任何答案,并且我已经使用了一段时间,所以我认为应该发布答案。
事实证明,类扩展是全局的-如果一个模块扩展了一个类,则由于存在该模块,每个模块都会对其进行扩展。这与是否导入第二个模块(仅在安装第二个模块时)无关。
例如如果模块A 包含类Foo
,并且模块B 扩展Foo
以符合某些协议(例如Hashable
)。如果模块A 然后检查Hashable
是否符合,它将发现Foo
确实符合并且仅当还存在模块B 时。 / p>