在Xcode 9中,我正在更新一个从Swift 3到Swift 4的项目。
在迁移过程中,当它要求我选择"Swift 4 @objc推理“时,我选择”最小化推理(推荐)“。
然后,我遵循Xcode帮助页面中的所有步骤,标题为“迁移到Swift 4 @objc推理”,“完成Swift 4最小化推理迁移”一段。
在完成最后两个步骤(“打开项目的构建设置。;将Swift 3 @objc推断设置为默认值”)之后,我的应用程序中突然没有调用didSelectRowAtIndexPath。没有错误或警告,只是没有调用。
发布于 2017-09-20 19:23:41
tl;dr:
结果,我需要将定义didSelectRowAtIndexPath的类扩展标记为didSelectRowAtIndexPath。
详细信息:
请注意,在大多数情况下,didSelectRowAtIndexPath是在用于符合UITableViewDelegate协议的类扩展中定义的,而我的设置由于继承而有所不同:
我有一个ParentVC和一个ChildVC。ParentVC通过类扩展与UITableViewDelegate保持一致(这种方法在苹果的“Swift 4编程语言(Swift 4)”“添加协议与扩展的一致性”中提到)。ParentVC实现了一些UITableViewDelegate方法,但没有实现didSelectRowAtIndexPath。
ChildVC实际上是实现didSelectRowAtIndexPath的地方。这是在类扩展( ChildVC)中完成的,但是请注意,这个类扩展不包含一致性(: UITableViewDelegate) (ParentVC已经这样做了,并且尝试在ChildVC中也这样做会导致“冗余一致性”错误)。
因此,将@objc添加到ChildVC中的类扩展中解决了这个问题。
不确定这是否是Swift/Xcode/编译器/分析器中的一个bug (可能至少有一个警告?),或者我用于协议一致性+继承的方法是否有缺陷,是否愿意听听其他人的看法。
https://stackoverflow.com/questions/46330255
复制相似问题