禁用 Xcode 9 的 Swift 3 中 @objc 推断
文章目录
swift3 to swift4
===
使用 xcode 9 自动从 swift3 升级到 swift4 后改动并不多, 选择 deployment target 8.0 时,编译代码提示下面警告⚠️
|
|
原因: 未知
解决方式: 禁用Xcode 9的Swift 3 @objc推断
|
|
“Swift 3 @objc Inference”设置是做什么的?
===
在Swift 4之前,编译器对Objective-C自动提供了一些Swift声明。 例如,编译器会为NSObject子类的所有方法创建Objective-C入口点。 该机制称为@objc推断(@obj Inference)
。
在Swift 4中,这种自动@objc推断已被废弃,因为生成所有这些Objective-C入口点有代价。 当“Swift 3 @objc Inference”设置为“On”时,它允许旧代码运行。 但是,它会提示这些需要解决的弃用警告,建议“修复”这些警告,并将设置切换到“Default”。新的Swift项目的默认为“Default”。
示例一:Swift 4之前
这段代码在Swift 4之前是有效的,因为方法foo自动暴露给Objective-C:
|
|
示例二:Swift 4
试试在Swift 4中运行相同的代码:
|
|
现在编译器显示一个错误,因为foo方法不再可以从Objective-C获得。 为方便起见,Swift 4代码迁移将“Swift 3 @objc Inference”设置为“On”,这使得我们的代码编译时出现以下警告:
|
|
让类成员可以在Objective-C里使用
如果我们想要从Objective-C访问声明,我们可以使用@objc注释标记个别成员:
|
|
或者,如果我们希望类的所有成员都暴露于Objective-C,可以使用@objcMembers注释来标记该类:
|
|
文章作者 Rango
上次更新 2018-05-17