禁用Xcode 9的Swift 3 @objc推断

禁用Xcode 9的Swift 3 @objc推断

今天我安装了Xcode 9,并将我的项目转换为Swift 4.0。 令人惊讶的是,我的代码只需做很少的改动就可以兼容新的Swift。 然而,构建后出现一个警告:

The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and disable Swift 3 @objc inference.

这里记录了我如何去掉这个警告:

  1. 在项目导航栏单击项目
  2. 选择目标(target)
  3. 点击Build Settings
  4. 在搜索框输入“inference”,快速找到设置
  5. 最后把“Swift 3 @objc Inference”设置为“Default”,重新构建项目

“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:

  1. class  MyClassNSObject {
  2.    func foo({}
  3.    func test({
  4.      var cl: AnyObject
  5.     cl = MyClass()
  6.     cl.foo?()  // Swift 4之前没有问题
  7.   }
  8. }

示例二:Swift 4

试试在Swift 4中运行相同的代码:

  1. class  MyClassNSObject {
  2.    func  foo() {}
  3.    func  test() {
  4.      var cl:  AnyObject
  5.     cl =  MyClass()
  6.     cl.foo?()  // Error: Value of type  'AnyObject'  has  no  member  'foo'
  7.   }
  8. }

现在编译器显示一个错误,因为foo方法不再可以从Objective-C获得。 为方便起见,Swift 4代码迁移将“Swift 3 @objc Inference”设置为“On”,这使得我们的代码编译时出现以下警告:

Reference to instance method 'foo()' of 'MyClass' depends on '@objc' attribute inference deprecated in Swift 4.

让类成员可以在Objective-C里使用

如果我们想要从Objective-C访问声明,我们可以使用@objc注释标记个别成员:

  1. class MyClass : NSObject {
  2.   @ objc func foo() { }  // 这个方法可以在Objective-C访问到
  3.    func bar() { }  // 但这个方法不行
  4. }

或者,如果我们希望类的所有成员都暴露于Objective-C,可以使用@objcMembers注释来标记该类:

  1. @objcMembers  // 所有的类成员都暴露于Objective-C
  2. class MyClass : NSObject {
  3.    func foo() { }
  4.    func bar() { }
  5. }

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值