禁用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.
这里记录了我如何去掉这个警告:
- 在项目导航栏单击项目
- 选择目标(target)
- 点击Build Settings
- 在搜索框输入“inference”,快速找到设置
- 最后把“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:
class MyClass: NSObject {func foo() {}func test() {var cl: AnyObjectcl = MyClass()cl.foo?() // Swift 4之前没有问题}
}
示例二:Swift 4
试试在Swift 4中运行相同的代码:
class MyClass: NSObject {func foo() {}func test() {var cl: AnyObjectcl = MyClass()cl.foo?() // Error: Value of type 'AnyObject' has no member 'foo'}
}
现在编译器显示一个错误,因为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注释标记个别成员:
class MyClass : NSObject {@objc func foo() { } // 这个方法可以在Objective-C访问到func bar() { } // 但这个方法不行
}
或者,如果我们希望类的所有成员都暴露于Objective-C,可以使用@objcMembers注释来标记该类:
@objcMembers // 所有的类成员都暴露于Objective-C
class MyClass : NSObject {func foo() { }func bar() { }
}
参考
- Limiting @objc inference Swift proposal.
- An answer on Stack Overflow.
转载请注明:文章转载自 码经笔记 [https://majing.io]
本文链接:https://majing.io/posts/10000001351160
版权声明:本文内容由互联网用户贡献,著作权归作者所有。
原文: Disabling Swift 3 @objc inference in Xcode 9
禁用Xcode 9的Swift 3 @objc推断相关推荐
- Xcode Instruments调试swift入门教程
无论您是在许多iOS应用程序上工作,还是仍在开始使用第一个应用程序:您无疑会想出新功能,并且想知道您可以做些什么来使您的应用程序更加出色 除了通过添加功能改进您的应用程序之外,所有优秀的应用程序开发人 ...
- ios开发--用Xcode 8和Swift 3 构建条形码和二维码识别器
原文:Building a Barcode and QR Code Reader in Swift 3 and Xcode 8 作者:SIMON NG 译者:CocoaChina-Fairy-happ ...
- Foxit Mobile PDF SDK 入门级(1)-显示一个PDF-Swift工程中的使用(Xcode 7.x, swift 2.x)
Swift 渐渐流行,Foxit的SDK是不是可以在Swift中很好的使用呢?答案当然是可以的啦. SDK的下载申请: 英文网站: http://www.foxitsdk.com/products/m ...
- MacOS Xcode与Swift版本对应关系
Swift4 Xcode9.0 or later macOS 10.12.6+ Xcode 9.4.1 macOS 10.13.2+ ...
- 如何在'纯'Swift中创建弱协议引用(不带@objc)
本文翻译自:How can I make a weak protocol reference in 'pure' Swift (without @objc) weak references don't ...
- swift 3 和 xcode 8
Swift 3 beta版 作为Xcode 8 的一部分发布,其包含了许多增强功能,很多功能是由开源组织提供的.swift 3 的主要目标是让最新的主要资源改变时必要的可以允许swift语言合并贯穿并 ...
- Xcode 12 Beta 3 更新记录SwiftUI2
Xcode 12 Beta 3发行说明 更新您的应用程序以使用新功能,并针对API更改测试您的应用程序. 总览 Xcode 12 beta 3包括适用于iOS 14,iPad OS 14,tvOS 1 ...
- 翻译Raywenderlich 最新文章What’s New in Swift 4
Swift学习交流群: 313838956 . 本群由Guards翻译组创建并维护, 志于给认真想学习Swift的同学打造一个良好的交流圈子. 同时群内会不间断分享Swift的资料, 如果你想学习Sw ...
- Module System of Swift (简析 Swift 的模块系统)
原文地址: http://andelf.github.io/blog/2014/06/19/modules-for-swift/ Swift 中模块是什么?当写下 Swift 中一句 import C ...
最新文章
- 开发Eclipse自定义控件
- How to call DLL and LIB files (SDK)
- php 数组键值分离,array_keys array_values::PHP数组键名于键值分离
- ASP.NET中 DropDownList+DetailsView(详细视图)的使用前台绑定
- 调试Excel VBA代码
- 书评:JBoss AS 7:配置,部署和管理
- 有向图的拓扑排序算法JAVA实现
- 未定义标识符 stringc/c++(20)_拓展巩固练习(2020.5.20)
- 深圳车联网云服务商“麦谷科技”获5000万Pre A轮融资
- 侧方、s弯道、坡起相关
- 项目经理的10条规则
- centos 安装 libiconv
- Dreamweaver/Flash CS4安装后打开时提示此产品的许可已停止工作
- Git 学习笔记——管理员篇
- 1156 Sexy Primes (20 分)(质数 模拟
- PMOS双电源供电隔离电路(USB接入为电池充电 电池断开供电)
- vue3使用swiper+animate.css动效
- ROX-Filer 2.6
- 数据库-差集交集并集
- 7-7 厘米换算英尺英寸 (10分)