xcode12.3 swift 桥接文件_OC与Swift混编项目迁移到Swift4.2小记
OC与Swift混编项目迁移到Swift4.2小记
前言
自从Xcode10正式版发布之后, 先吃螃蟹的朋友赞叹了Dark Mode的惊艳, 同时也报告说, 打包上传到APPStroe后, 监测到线上 iOS9.3设备大面积crash的记录, 最后被证实是Xcode10的问题.
出于此原因考虑, 我便一直在使用Xcode9.4.1 及 Swift4进行混编项目的开发.
然而每每使用低版本的Xcode打包上传APPStore时, 就会收到苹果的官方警告邮件
如邮件内容所示, 到2019年的3月份便不可以再使用低版本Xcode进行打包上传操作了.
于是, 我只好开始了迁移之路.
开始迁移
使用当前 Xcode10.1(10B61)打开之后, 在Build Setting中搜索 Swift Language Version, 将对应的值改为Swift 4.2,然后开始编译, 此时会出现非常多的Error, 多为ABI的变动, 根据提示进行修改即可.
AVAudioSession的更改
然而有一处例外:
当项目中通过Swift使用了 AVAudioSession setCategory这个方法时, 会被告知方法在Swift中不可用.跳转才发现 API已经变化成了
/* set session category and mode with options */ @available(iOS 10.0, *) open func setCategory(_ category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions = []) throws复制代码
为了兼容低版本, 思来想去, 比较合适的方案就是使用OC编写一个AVAudioSession的分类用来桥接:
// AVAudioSession+Swift.h:@import AVFoundation;NS_ASSUME_NONNULL_BEGIN@interface AVAudioSession (Swift)- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:));- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:options:));@endNS_ASSUME_NONNULL_END// AVAudioSession+Swift.m:#import "AVAudioSession+Swift.h"@implementation AVAudioSession (Swift)- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError { return [self setCategory:category error:outError];}- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return [self setCategory:category withOptions:options error:outError];}@end复制代码
然后在你项目的-Bridging-Header.h中import这个分类:
#import "AVAudioSession+Swift.h"复制代码
然后就可以像之前一样调用了.
try AVAudioSession.sharedInstance().setCategory(.playback)复制代码
While deserializing SIL vtable for 'Class' in module 'module' error: Abort trap: 6
这类问题分两种, 一种是module是其他的target, 如Pods中的, 另一种是 module是自己的创建的target.
第一种
第一种 只需要将Error所指向的三方库更新到最新版本即可, Xcode10已经发布了快半年了, 这些问题之前也有, 半年的时间, 基本上流行的三方库都已经适配了Swift4.2
第二种
而第二种比较棘手, 一般都是由于 Error中的Class所指向的类, 自己是Swift类, 但是却继承自Objective-C声明编写的类. 我在自己试过一些微调之后发现于事无补, 所以只好将出错的类使用Objective-C重写, 然后在桥接文件中引入, 好在报错的不多, 没用费太多力气.
其他奇怪的错误
迁移完成后 项目跑起来时, 还会出现很多奇怪的问题. 比如调用了某个方法A 会报unrecognize selector *, 以及莫名的函数调用, 如:
(setupNavibar函数中并没用调用任何初始化构造函数)
这类错误, 一般跟以上的俩种问题是一个本质, 需要自己仔细区别, 然后做出相应更新/更改即可.除开以上的问题, 项目编译时还会在Pods引用的第三方的类中报ABI需要修改的Error, 这时, 只需要找到队形的Target, 在其Build Settings中修改 Swift Language Version为其对应版本即可.
最后, 希望将来适配Swift5时, 不要有这么多坑了...
xcode12.3 swift 桥接文件_OC与Swift混编项目迁移到Swift4.2小记相关推荐
- Objective-C 和 Swift 混编项目的小 Tips(一)
本文主要闲聊一些 Objective-C 和 Swift 混编项目带来的一些潜规则,希望能帮到对此感到疑惑的朋友.下面我们开始进入主题: 命名 官方 Guide 上只是简单叙述(Using Swift ...
- 初探swift语言的学习笔记九(OC与Swift混编)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Swift和Objective-C混编注意事项
前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...
- Swift和Objective-C混编
Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0 OCSwift混编 前言 Swift已推出数年,与O ...
- IOS --- OC与Swift混编(转)
原文地址:http://blog.sina.com.cn/s/blog_8d1bc23f0102v5tl.html swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一 ...
- oc与swift混编教程
原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 swift 语言出来后,可能新的项目直接使用swift来开发, ...
- 从预编译的角度理解Swift与Objective-C及混编机制
本文从预编译的基础知识入手,由浅至深的介绍了 Objective-C 和 Swift 的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编. 写在前面 ...
- IOS开发之OC-Switf 混编 -(OC 引 Swift 文件)
上篇文章我们介绍了Swift 怎么引 OC 文件接来我们开始OC 引 Swift 文件. (一)OC 引 Swift 文件 1.创建 Demo ( 这个 Demo 名称一定要记住) 2.创建 Sw ...
- swift 和 oc混编 找不到头文件等问题
1 swift项目,找不到第三方文件,exp:AFN.h找不到,要修改build settings 里的User header custome search paths ,改成${SRCROOT},选 ...
最新文章
- Qt 从C ++定义QML类型(二)
- Java编程中最容易踩雷的地方!
- 华为杯数学建模优秀论文_数学建模经典例题(2011年国赛A题与优秀论文)
- 为什么用自己的电脑部署服务器之后外网访问不到呢?并且该如何解决这个问题呢?...
- python调用os.system启动anaconda环境_在Mac中PyCharm配置python Anaconda环境过程图解
- Mybatis-no getter for property named 'col_name' in 'class com.xxx.onebean'
- 向linux服务器上传下载文件方式收集
- 20200621每日一句
- 文件下载测试的测试点
- 二维条码和射频识别技术在仓储物流系统中的应用
- 5.ESL笔记:线性模型与高斯-马尔科夫定理
- 计算机新生导论感言,新生入学感言范文精选
- 用四位16进制代码控制颜色
- html中动态添加元素属性值,JavaScript实现动态添加、移除元素或属性的方法分析...
- 电脑删除快捷键还有哪些?学会了让工作效率更提升
- 【每周CV论文推荐】初学视觉注意力机制有哪些值得阅读的论文?
- [转]拍照怎么搜题?(下)
- Thinkpad X230 升级 AX210 wifi6 无线网卡
- SpringBoot电商项目前后端界面搭建
- 【热血足球联盟】补丁记录
热门文章
- sql server 替换有反斜杠的字符串_字符串提取,到底谁是你的菜?
- python网络监控程序_python linux监控程序
- 基于selenium的钓鱼工具:关于ReelPhish神器的使用
- Java中基于TCP通过socket嵌套字连接方式传送文件
- 【Qt教程】2.6 - Qt5 自定义控件封装
- git常用命令/mac上从零完成本地上传和下载github代码
- 剑指offer——10.斐波那契数列
- MySQL学习记录 (三) ----- SQL数据定义语句(DDL)
- 关于微软的VB和C#:为何Basic需要存在,为何VB如此像C#,为何两者不合并等
- javascript 怎样才能确定参数变量的个数呢?