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

Xcode 10.2 with Swift 5.0 compiler - protocol inheritance issue

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

有一个 BasicViewController class 具有以下签名:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

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

棘手的部分来了...

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

我想不出什么时候会发生这种情况。而且它变得更糟,因为我发现更多类似的问题是 UITableViewDelegate 方法仅在 运行 归档应用程序时未在子 class 中调用。归档和提交应用程序期间的某些优化是否有问题?

我确认我们正确设置了 table 的 dataSourcedelegate,table 上没有手势识别器。同样的逻辑在 运行 应用 second/third 次后运行良好,但在深度清理项目后第一次失败。

我们进行了测试,并在子 class 中设置了 UITableViewDataSourceUITableViewDelegate,然后每次都按预期工作。似乎继承协议效果不佳。如果我们将协议保留在父级中并将它们添加到子级 class 中,那么它表示子级 class 中的协议是多余的。

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

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

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

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

您应该使用 Storyboard 和 Class 附加 dataSourcedelegate,因为有一次我对 tableview 遇到了同样的问题,这是由于在class我还没做

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

我认为你不是这样做的。

我知道没有必要同时使用这两种样式,但有时我们需要这样做。看看这个答案

我运行遇到了同样的问题。我通过直接在我的主要 class 中添加方法并在其他 class 中 覆盖 它们来修复它。现在一切都被正确调用了。