当前位置: 首页 > 面试题库 >

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

宦子琪
2023-03-14
问题内容

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

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

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

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

现在是棘手的部分…

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

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

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

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



 类似资料:
  • 问题内容: protocol BasePresenterProtocol : class {} protocol DashboardPresenterProtocol : BasePresenterProtocol {} 在上面的代码中,我在下一行收到错误 ,但未确认协议,但我已在中声明。虽然我已经宣布 为什么会出现此错误?请让我知道我在这段代码中做错了什么。 问题答案: 您不能使用type 属性

  • 问题内容: 我正在开发一个使用angular作为客户端框架的应用程序,目前使用angular作为岩石,我真的很高兴,尽管现在我发现我经常复制和粘贴要组织成类层次结构的代码。例如,对话框共享一组通用的功能,需要打开,关闭它们,提供功能的代码也是从某些父BaseTypeaheadClass继承的首选对象,尽管我在angular中没有发现的一件事是组织这些层次结构。控制器,服务和提供者都在下面使用普通的

  • 我正努力做: 但由于某种原因,我得到了编译器错误: CS0533'混凝土。Execute()'隐藏继承的抽象成员'程序。基础执行() 我在过去隐藏了很多成员,但从来没有遇到过这种情况,我在这里很困惑。在MSDN和web上花了很长时间,但找不到有关此行为的任何信息。 我真的非常感谢你对这个问题的任何见解。 这是小提琴。

  • 问题内容: 我有一个协议扩展,它过去在swift 2.2之前可以完美地工作。 现在我有一个警告,告诉我使用新的,但是如果我添加它 没有使用Objective-C选择器声明任何方法。 我尝试通过以下几行代码重现该问题,可以轻松将其复制并粘贴到操场上 还有一个建议在协议中附加到该方法,但是如果我这样做,它还会要求我将其添加到实现该方法的类中,但是一旦添加,该类便不再符合该协议,因为它不符合该协议似乎看

  • 本文向大家介绍详解C++编程中的私有继承和公有继承,包括了详解C++编程中的私有继承和公有继承的使用技巧和注意事项,需要的朋友参考一下 C++类的私有继承 在声明一个派生类时将基类的继承方式指定为private的,称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class ), 其基类称为私有基类(private base class )。 私有基类的公用成

  • 我目前在编译protobuf生成的C代码时遇到了一些问题<代码>协议(code>protoc)运行正常,不会显示任何警告,但是,当我尝试编译生成的C代码以便构建静态库时,g向我显示以下消息: CanInfo。pb。抄送:107:5:错误:“::protobuf\u BusType\u 2eproto”尚未声明107;::protobuf\u BusType\u 2eproto::AddDescri