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小记相关推荐

  1. Objective-C 和 Swift 混编项目的小 Tips(一)

    本文主要闲聊一些 Objective-C 和 Swift 混编项目带来的一些潜规则,希望能帮到对此感到疑惑的朋友.下面我们开始进入主题: 命名 官方 Guide 上只是简单叙述(Using Swift ...

  2. 初探swift语言的学习笔记九(OC与Swift混编)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  3. Swift和Objective-C混编注意事项

    前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...

  4. Swift和Objective-C混编

    Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0  OCSwift混编 前言 Swift已推出数年,与O ...

  5. IOS --- OC与Swift混编(转)

    原文地址:http://blog.sina.com.cn/s/blog_8d1bc23f0102v5tl.html swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一 ...

  6. oc与swift混编教程

    原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 swift 语言出来后,可能新的项目直接使用swift来开发, ...

  7. 从预编译的角度理解Swift与Objective-C及混编机制

    本文从预编译的基础知识入手,由浅至深的介绍了 Objective-C 和 Swift 的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编. 写在前面 ...

  8. IOS开发之OC-Switf 混编 -(OC 引 Swift 文件)

    上篇文章我们介绍了Swift 怎么引 OC 文件接来我们开始OC 引 Swift  文件. (一)OC 引 Swift  文件 1.创建 Demo ( 这个 Demo 名称一定要记住) 2.创建 Sw ...

  9. swift 和 oc混编 找不到头文件等问题

    1 swift项目,找不到第三方文件,exp:AFN.h找不到,要修改build settings 里的User header custome search paths ,改成${SRCROOT},选 ...

最新文章

  1. Qt 从C ++定义QML类型(二)
  2. Java编程中最容易踩雷的地方!
  3. 华为杯数学建模优秀论文_数学建模经典例题(2011年国赛A题与优秀论文)
  4. 为什么用自己的电脑部署服务器之后外网访问不到呢?并且该如何解决这个问题呢?...
  5. python调用os.system启动anaconda环境_在Mac中PyCharm配置python Anaconda环境过程图解
  6. Mybatis-no getter for property named 'col_name' in 'class com.xxx.onebean'
  7. 向linux服务器上传下载文件方式收集
  8. 20200621每日一句
  9. 文件下载测试的测试点
  10. 二维条码和射频识别技术在仓储物流系统中的应用
  11. 5.ESL笔记:线性模型与高斯-马尔科夫定理
  12. 计算机新生导论感言,新生入学感言范文精选
  13. 用四位16进制代码控制颜色
  14. html中动态添加元素属性值,JavaScript实现动态添加、移除元素或属性的方法分析...
  15. 电脑删除快捷键还有哪些?学会了让工作效率更提升
  16. 【每周CV论文推荐】初学视觉注意力机制有哪些值得阅读的论文?
  17. [转]拍照怎么搜题?(下)
  18. Thinkpad X230 升级 AX210 wifi6 无线网卡
  19. SpringBoot电商项目前后端界面搭建
  20. 【热血足球联盟】补丁记录

热门文章

  1. sql server 替换有反斜杠的字符串_字符串提取,到底谁是你的菜?
  2. python网络监控程序_python linux监控程序
  3. 基于selenium的钓鱼工具:关于ReelPhish神器的使用
  4. Java中基于TCP通过socket嵌套字连接方式传送文件
  5. 【Qt教程】2.6 - Qt5 自定义控件封装
  6. git常用命令/mac上从零完成本地上传和下载github代码
  7. 剑指offer——10.斐波那契数列
  8. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)
  9. 关于微软的VB和C#:为何Basic需要存在,为何VB如此像C#,为何两者不合并等
  10. javascript 怎样才能确定参数变量的个数呢?