ios - Xcode 10.2与Swift 5.0编译器-协议继承问题




protocols (2)

我们对当前的Xcode版本(10.2)存在很大问题。

有一个带有以下签名的 BasicViewController 类:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

然后我们有另一个类,如 ExampleViewController: BasicViewController ,它有一些额外的逻辑。

现在是棘手的部分......

我们在不同的模拟器和设备上构建和运行应用程序,一切正常。 然后我们存档应用程序,突然 didSelectRow 不再被解雇。 深度清洁和清理项目使我们能够重现问题,而无需再次存档。

在发生这种情况时,我无法想到任何情况。 而且它变得更糟,因为我发现更多类似的问题, UITableViewDelegate 方法仅在运行存档应用程序时才在子类中调用。 在归档和提交应用程序期间,这可能是一些优化问题吗?

我验证我们正确设置了表的 dataSourcedelegate ,表上没有手势识别器。 在第二次/第三次运行应用程序后,相同的逻辑运行良好,但在深度清理项目后第一次失败。

我们做了一个测试并在子类中设置了 UITableViewDataSourceUITableViewDelegate ,然后每次都按预期工作。 似乎继承协议不能很好地工作。 如果我们将协议保留在父级中并将它们添加到子类中,那么它表示子类中的协议是冗余的。

有没有人经历过类似的事? 欢迎任何建议。


您可能正在运行Swift 5.0编译器中的 https://bugs.swift.org/browse/SR-10257 。 如果您至少有三个文件,则会发生这种情况:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

如果 SomeOtherFile.swiftAnyObject -typed值进行任何调用,那么您将在 wholemodule 模式下进行编译,并且文件按上述顺序传递给编译器( SomeOtherFile.swift 位于两者的中间),然后似乎编译器无法正确推断 @objcfunc tableView(_:, didSelectRowAt:) 。 您现在可以通过使用 @objc 显式标记它来解决它。


您应该使用 Storyboard 和Class附加 dataSourcedelegate 两方,因为一旦我对tableview有相同的问题而且它是由于在课堂上我还没有完成

self.tableView.delegate = self
self.tableView.datasource = self

我想你不是这样做的。

我知道没有必要同时使用这两种风格,但有时我们需要它。 看看这个答案 https://.com/a/39443079/3485420







protocols