简要地说,在使用Xcode 9 Beta时,我遇到了以下警告:
不建议在Swift 4模式下使用Swift 3 @objc推断。请解决已弃用的@objc推断警告,启用“使用已弃用的Swift 3 @objc推断”日志记录来测试您的代码,并禁用Swift 3 @objc推断。**
经过研究后,我仍然不知道如何解决该问题。我将不胜感激有关如何解决此问题的所有技巧以及对所发生情况的解释。
我的目标是更好地理解我的代码正在发生的事情。
简要地说,在使用Xcode 9 Beta时,我遇到了以下警告:
不建议在Swift 4模式下使用Swift 3 @objc推断。请解决已弃用的@objc推断警告,启用“使用已弃用的Swift 3 @objc推断”日志记录来测试您的代码,并禁用Swift 3 @objc推断。**
经过研究后,我仍然不知道如何解决该问题。我将不胜感激有关如何解决此问题的所有技巧以及对所发生情况的解释。
我的目标是更好地理解我的代码正在发生的事情。
Answers:
我通过将目标的“ Swift 3 @objc Inference”构建设置更改为“ Default”来摆脱此警告。
从这篇文章:
在Swift 4之前,编译器自动将一些Swift声明提供给Objective-C。例如,如果从NSObject继承了一个子类,则编译器会为此类中的所有方法创建Objective-C入口点。该机制称为@objc推断。
在Swift 4中,不建议使用这种自动@objc推断,因为生成所有这些Objective-C入口点的成本很高。当“ Swift 3 @objc Inference”设置设置为“ On”时,它将允许旧代码起作用。但是,它将显示需要解决的弃用警告。建议“修复”这些警告并将设置切换为“默认”,这是新Swift项目的默认设置。
另请参阅此Swift提议。
@objc
在Swift 4模式下使用Swift 3 推断。请解决不建议使用的@objc
推断警告,启用“使用不建议使用的Swift 3 @objc
推断”日志记录来测试代码,并禁用Swift 3 @objc
推断。” 任何想法在哪里启用所说的Swift 3 @objc
推理日志记录?
@objc
推论?到底是怎么回事?在中Swift 3
,编译器会@objc
在许多地方进行推断,因此您不必这样做。换句话说,它确保@objc
为您添加!
在中Swift 4
,编译器不再(最多)这样做。现在,您必须@objc
显式添加。
默认情况下,如果您有一个Swift 4之前的项目,则会收到有关此问题的警告。在Swift 4项目中,您将获得构建错误。这是通过SWIFT_SWIFT3_OBJC_INFERENCE
构建设置控制的。在Swift 4之前的项目中,该设置为On
。我建议将其设置为Default
(或Off
),这是新项目的默认选项。
转换所有内容将花费一些时间,但是由于它是Swift 4的默认设置,因此值得这样做。
有两种方法可以转换代码,以使编译器不会抱怨。
一种是@objc
在需要公开给Objective-C运行时的每个函数或变量上使用:
@objc func foo() {
}
另一种是@objcMembers
通过Class
声明使用。这样可以确保自动将类@objc
中的所有函数和变量添加到其中。这是简单的方法,但是有一定的成本,例如,它可以通过公开不需要公开的功能来增加应用程序的大小。
@objcMembers class Test {
}
@objc
,为什么有必要?如果您向Swift类引入新的方法或变量,则将它们标记为@objc
将它们暴露给Objective-C运行时。如果您有使用Swift类的Objective-C代码,或者使用的是Objective-C类型的功能,则这是必需的Selectors
。例如,目标动作模式:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
@objc
?标记为@objc
:
请记住,这是一个非常高级的摘要,它比我写的还要复杂。我建议阅读实际的建议以获取更多信息。
@objc
并不意味着动态调度,Swift可以自由使用静态或虚拟调度(并可能执行不同的代码)。该dynamic
关键字是必需的强制斯威夫特使用动态调度。
@objc
了我们必须使用什么?
SWIFT_SWIFT3_OBJC_INFERENCE
在出发On
。转换为Swift4 @objc
。然后解决问题。为了简单起见,请遵循基本规则:如果在Objc-C代码中使用Swift类(通过桥接标头),请使用@objcMembers
,否则,一个接一个地添加@objc
。只需使用Xcode搜索来查找是否从任何.m
文件中调用了Swift类。这应该使转换相对简单。
@objc
在Swift 4中进行了更改,然后决定修复项目并保持不变。
我使用“ Swift 3 @objc Inference” =“默认”设置发出了此警告。然后我意识到这是为项目设置的-不是针对目标的。因此,请确保您的目标中具有“默认”设置以摆脱警告。
确实,通过禁用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”设置为默认值后,我项目的某些功能停止工作。我花了一些调试和研究才能找到解决方案。据我所知,以下是选项:
重新启用@objc推断会使您得到警告,但这是最快的解决方案。请注意,它仅适用于从早期Swift版本迁移的项目。其他两个选项比较繁琐,需要进行一些代码挖掘和大量测试。
另请参见https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
Swift 3 @objc推定不建议在Swift 4模式下使用Swift 3 @objc推论。请解决已弃用的@objc推断警告,在启用“使用已弃用的Swift 3 @objc推断”记录的情况下测试您的代码,然后通过将“ XMLParsingURL”的“ Swift 3 @objc推断”构建设置更改为“默认”来禁用推断。目标。
到了
第一步获得构建设置
搜索以进行构建设置推断
快速更改3 @objc推断默认