简单地说,在使用Xcode 9 Beta时,我遇到了以下警告:

不建议在Swift 4模式中使用Swift 3 @objc推断。请解决已弃用的@objc推断警告,测试代码时启用“使用已弃用的Swift 3 @objc推断”日志记录,并禁用Swift 3 @objc推断。**

经过一番研究,我仍然不知道如何解决这个问题。 我将非常感谢任何关于如何解决这个问题的提示,以及对正在发生的事情的解释。

我的目标是更好地理解我的代码发生了什么。


当前回答

Swift 3 @objc推断 不建议在Swift 4模式中使用Swift 3 @objc推断。请解决已弃用的@objc推断警告,测试您的代码,启用“使用已弃用的Swift 3 @objc推断”日志记录,然后通过将“Swift 3 @objc推断”构建设置更改为“默认”的“XMLParsingURL”目标来禁用推断。

到了

第一步是构建设置 搜索到构建设置推理 change swift 3 @objc Inference默认值

在这里输入图像描述

其他回答

我有这个警告“Swift 3 @objc Inference”=“默认”设置。然后我意识到这是为项目设置的,而不是为目标设置的。所以,确保你在目标中有“默认”设置,以消除警告。

您可以尝试“Pod更新”和/或“颤振清理”

我也在xcode中设置了这个设置。

Objective-C界面设置如下:

我摆脱了这个警告通过改变“Swift 3 @objc推断”构建设置我的目标为“默认”。

从这篇文章中:

Before Swift 4, the compiler made some Swift declarations automatically available to Objective-C. For example, if one subclassed from NSObject, the compiler created Objective-C entry points for all methods in such classes. The mechanism is called @objc inference. In Swift 4, such automatic @objc inference is deprecated because it is costly to generate all those Objective-C entry points. When "Swift 3 @objc Inference" setting is set to "On", it allows the old code to work. However, it will show deprecation warnings that need to be addressed. It is recommended to "fix" these warnings and switch the setting to "Default", which is the default for new Swift projects.

更多信息请参考Swift提案。

Migrator不能识别所有需要@objc的函数 推断的Objective-C坦克标记为已弃用,以帮助您找到它们 •构建关于已弃用方法的警告 •运行过时的坦克时控制台消息

事实上,你可以通过禁用Swift 3 @objc Inference来消除这些警告。 然而,可能会出现一些微妙的问题。例如,KVO将停止工作。 这段代码在Swift 3下工作得很完美:

for (key, value) in jsonDict {
    if self.value(forKey: key) != nil {
        self.setValue(value, forKey: key)
    }
}

在迁移到Swift 4,并将“Swift 3 @objc Inference”设置为默认值后,我的项目的某些功能停止了工作。 我花了一些调试和研究来找到解决方案。 据我所知,有以下几种选择:

启用“Swift 3 @objc Inference”(仅适用于从Swift 3迁移现有项目) 将受影响的方法和属性标记为@objc 使用@objcMembers为整个类重新启用ObjC推断

重新启用@objc推理会给您留下警告,但这是最快的解决方案。注意,它只适用于从早期Swift版本迁移的项目。 另外两个选项比较乏味,需要一些代码挖掘和广泛的测试。

参见https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md