禁用@objc 推理后未调用 didSelectRowAtIndexPath(Xode 9,Swift 4)

didSelectRowAtIndexPath not called after disabling @objc Inference (Xode 9, Swift 4)

我正在将项目从 Swift 3 更新到 Swift 4,在 Xcode 9.

在迁移过程中,当它让我选择"Swift 4 @objc Inference"时,我select"Minimize Inference (recommended)"。

然后我按照标题为 "Migrate to Swift 4 @objc inference" 的 Xcode 帮助页面中的所有步骤进行操作,第 "Completing a Swift 4 minimize inference migration" 段。

完成最后两个步骤 ("Open the build settings for the project.; Set Swift 3 @objc inference to Default.") 后,突然 didSelectRowAtIndexPath 没有在我的应用程序中调用。没有错误和警告,只是没有调用。

tl;博士:
结果我需要将定义了 didSelectRowAtIndexPath 的 class 扩展标记为 @objc


详情:

请注意,虽然在大多数情况下 didSelectRowAtIndexPath 是在用于符合 UITableViewDelegate 协议的 class 扩展中定义的,但由于继承,我的设置有所不同:

我有一个 ParentVC 和一个 ChildVCParentVC 通过 class 扩展符合 UITableViewDelegate(此方法在 Apple 的 "The Swift Programming Language (Swift 4)" 中提到,在 "Adding Protocol Conformance with an Extension" 下)。 ParentVC 实现了一些 UITableViewDelegate 方法,但没有实现 didSelectRowAtIndexPath.

ChildVCdidSelectRowAtIndexPath真正实现的地方。这是在 class 扩展(ChildVC)中完成的,但请注意,此 class 扩展不包含一致性(: UITableViewDelegate)(ParentVC 已经包含这并试图在 ChildVC 中也这样做会导致 "Redundant conformance" 错误)。

因此将 @objc 添加到 ChildVC 中的 class 扩展名解决了问题。

不确定这是否是 Swift/Xcode/compiler/analyzer 中的一个错误(也许至少是一个警告?),或者我用于协议一致性 + 继承的方法是否有缺陷,很想听听其他人对此的看法。