一尘不染

带有Swift 5.0编译器的Xcode 10.2-协议继承问题

swift

当前的Xcode版本(10.2)有一个大问题。

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

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

然后我们有另一个像ExampleViewController: BasicViewController这样的类,它具有一些附加的逻辑。

现在是棘手的部分…

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

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

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

我们进行了测试,UITableViewDataSourceUITableViewDelegate在子类中设置和,然后每次都能按预期运行。似乎继承协议不能很好地工作。如果我们将协议保留在父级中,并且也将其添加到子级中,则表明子级中的协议是多余的。

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


阅读 196

收藏
2020-07-07

共1个答案

一尘不染

您可能正在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两者中间),那么看来编译器无法正确推断@objc-实施的意愿func tableView(_:, didSelectRowAt:)。您现在可以通过显式标记它来解决它@objc

2020-07-07