Swift 4“此类不符合键值编码”

我有一个Swift库,它非常依赖来自NSObject obj.valueForKey()

迁移到Swift 4后,我发现这些调用总是崩溃,错误“这个类不是密钥值的密钥值…”除非我正在寻找的属性是用@objc声明的。

现在是否必须使用@objc声明属性,以便使用此方法找到它们? 还有其他选择吗?

当您执行迁移Xcode询问@objc推断时,您可能选择了新类型而不是Swift3。

可能的解决方案:

使用@objc

根据需要在每个方法上使用@objc而不是整个类。

使用@objcMembers

你可以在@objcMembers上使用@objcMembers

将@objcMembers属性应用于类会隐式地将@objc属性添加到其所有与Objective-C兼容的成员。

使用Objective-C行为编写Swift类和协议

请记住: 因为应用@objc属性会增加应用程序的编译大小并对性能产生负面影响,所以只有在每个成员都需要应用@objc属性时才对声明应用@objcMembers属性

切换对旧行为的推断

您还可以在以下内容下更改项目的行为: Build Settings > Swift 3 @objc Inference > On / Off

相关问题:

  • 不推荐在Swift 4模式下使用Swift 3 @objc推理?
  • 如何在Swift 4中使用#selector()处理@objc推理弃用?