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

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

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

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


当前回答

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

其他回答

在@wisekiddo所说的之上,您还可以在项目中修改您的构建设置。通过将SWIFT_SWIFT3_OBJC_INFERENCE = default设置为SWIFT_SWIFT3_OBJC_INFERENCE = default;对于你的构建风格(即调试和发布),特别是如果你来自Xcode以外的其他环境

事实上,你可以通过禁用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

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

在Swift 4模式下使用Swift 3 @objc推断已弃用?

使用func调用@objc

func call(){

foo()

}

@objc func foo() {

}

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

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

Objective-C界面设置如下: