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

22

当前 Xcode 版本(10.2)存在一个严重问题。

有一个名为 BasicViewController 的类,其签名如下:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

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

现在来到棘手的部分......

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

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

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

我们进行了测试,并在子类中设置了UITableViewDataSourceUITableViewDelegate,然后每次都按预期工作。似乎继承协议不起作用。如果我们将协议保留在父类中并在子类中添加它们,则会提示子类中的协议冗余。

是否有人遇到过类似的情况?欢迎任何建议。


你是遇到了协议继承的问题还是didSelectRow函数的问题? - Niki
@nTri,didSelectRow未被触发,并且根据我的测试,似乎与父类中的didSelectRow协议(UITableViewDelegate)有关。正如我所描述的那样,这是一种非常奇怪的行为,因此我尝试将所有想法和测试都放在了描述中。 - o15a3d4l11s2
1
同样的代码仍然可以在 Xcode 10.1 中工作吗?你应该尝试创建一个测试项目,看看在该项目中是否也出现了相同的问题,使用 Xcode 10.2。 - Dávid Pásztor
@DávidPásztor,似乎明确与Xcode 10.2有关。 - o15a3d4l11s2
我们似乎有一个非常相似的问题 - 但不确定是否完全相同。我们在这里发帖:https://stackoverflow.com/questions/56009500/basic-inheritance-breaking-in-xcode-10-2-with-swift-5-compiler - GPRyan
3个回答

15
您可能在 Swift 5.0 编译器中遇到了 https://bugs.swift.org/browse/SR-10257。如果您有至少三个文件:BasicViewController.swiftSomeOtherFile.swiftExampleViewController.swift。并且 SomeOtherFile.swift 对任何一个 AnyObject 类型的值进行了调用,同时您正在使用 wholemodule 模式编译,并按照上述顺序将这些文件传递给编译器(其中 SomeOtherFile.swift 在两个文件之间),那么似乎编译器无法正确地推断 func tableView(_:, didSelectRowAt:) 的实现应该被打上 @objc 标签。您暂时可以通过显式添加 @objc 来解决此问题,不过建议您升级到更高版本的 Swift。请注意保留所有 HTML 标签和格式,不要改变原意。

2
不使用 @objc 标记,关闭 wholemodule 优化是否更容易些? - o15a3d4l11s2
3
是的,你可以这样做,不过关闭 wholemodule 可能会对性能产生影响。你也可以通过将 Xcode 目标中的 BasicExample 移除,然后再添加它们来解决问题,这将导致它们以不同的顺序传递给编译器。 - BJ Homer
2
我在使用CBPeripheralDelegate升级到10.2时遇到了同样的问题。添加一个明确的@objc解决了这个问题。它没有正确地解析其中一个可选方法。 - Rob Napier
4
有趣的错误(或特性:P)...奇怪的是它的优先级中等,因为这可能会破坏很多应用程序。 - J. Doe
2
我添加了@objc,但仍然无法工作,有人可以帮忙吗? - Vasanthan Prem
显示剩余4条评论

2

我遇到了同样的问题。我通过直接在我的主类中添加方法并在其他类中覆盖它们来解决了它。现在一切都被正确地调用。


-5

你应该使用Storyboard和类将dataSourcedelegate两侧连接起来,因为我曾经在tableview上遇到过同样的问题,那是因为我没有在类中完成这一步骤。

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

我认为你不是这样做的。

我知道不必同时使用两种风格,但有时我们需要这样做。看看这个答案https://dev59.com/9Zrga4cB1Zd3GeqPqKvf#39443079


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接