Dal*_*leK 478 swift swift4 xcode9-beta
简而言之,在使用Xcode 9 Beta时,我遇到了以下警告:
不推荐在Swift 4模式下使用Swift 3 @objc推理.请解决已弃用的@objc推理警告,使用"使用已弃用的Swift 3 @objc推理"日志记录测试代码,并禁用Swift 3 @objc推理.**
经过一番研究,我仍然不知道如何解决这个问题.我将非常感谢有关如何解决此问题的任何提示以及对正在发生的事情的解释.
我的目标是更好地理解我的代码发生了什么.
Evg*_*nii 794
我通过将目标的"Swift 3 @objc Inference"构建设置更改为"Default"来消除此警告.
从这篇文章:
在Swift 4之前,编译器自动为Objective-C提供了一些Swift声明.例如,如果一个子类来自NSObject,则编译器为这些类中的所有方法创建了Objective-C入口点.该机制称为@objc推理.
在Swift 4中,不推荐使用这种自动@objc推理,因为生成所有Objective-C入口点的成本很高.当"Swift 3 @objc Inference"设置设置为"On"时,它允许旧代码工作.但是,它会显示需要解决的弃用警告.建议"修复"这些警告并将设置切换为"默认",这是新Swift项目的默认设置.
有关更多信息,请参阅此Swift提案.
kga*_*dis 262
@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() {
}
Run Code Online (Sandbox Code Playgroud)
另一种是@objcMembers通过Class声明来使用.这确保自动添加@objc到类中的所有函数和变量.这是一种简单的方法,但它有成本,例如,它可以通过暴露不需要公开的函数来增加应用程序的大小.
@objcMembers class Test {
}
Run Code Online (Sandbox Code Playgroud)
@objc以及为什么有必要?如果向Swift类引入新方法或变量,则将它们标记为@objc将它们公开给Objective-C运行时.当您拥有使用Swift类的Objective-C代码时,或者如果您使用的是Objective-C类型的功能时,这是必需的Selectors.例如,目标 - 行动模式:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
@objc?标记为@objc:
请记住,这是一个非常高级的摘要,它比我写的更复杂.我建议阅读实际提案以获取更多信息.
Has*_*leb 48
Migrator无法识别所有需要@objc
推断的Objective-C thunks标记为已弃用的函数以帮助您找到它们
•构建有关已弃用方法的警告
•运行不推荐的thunk时的控制台消息
实际上,你可以通过禁用Swift 3 @objc推理来消除这些警告.但是,可能会出现微妙的问题.例如,KVO将停止工作.这段代码在Swift 3下完美运行:
for (key, value) in jsonDict {
if self.value(forKey: key) != nil {
self.setValue(value, forKey: key)
}
}
Run Code Online (Sandbox Code Playgroud)
迁移到Swift 4并将"Swift 3 @objc推理"设置为默认值后,我项目的某些功能停止工作.我花了一些调试和研究来找到解决方案.根据我的最佳知识,以下是选项:
重新启用@objc推理会留下警告,但这是最快的解决方案.请注意,它仅适用于从早期Swift版本迁移的项目.另外两个选项更加繁琐,需要进行一些代码挖掘和大量测试.
另见https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
我是偶然的iOS开发人员(不久以后会更多),但我仍然找不到其他答案指导的设置(因为我没有答案显示的那个Keychain项),所以现在我发现了,我可能只是在快照中添加了需要单击并找到的突出显示的位置。
| 归档时间: |
|
| 查看次数: |
93860 次 |
| 最近记录: |