OC与Swift混编项目迁移到Swift4.2小记

栏目: Swift · 发布时间: 5年前

内容简介:自从出于此原因考虑, 我便一直在使用然而每每使用低版本的

自从 Xcode10 正式版发布之后, 先吃螃蟹的朋友赞叹了 Dark Mode 的惊艳, 同时也报告说, 打包上传到 APPStroe 后, 监测到线上 iOS9.3 设备大面积crash的记录, 最后被证实是 Xcode10 的问题.

出于此原因考虑, 我便一直在使用 Xcode9.4.1Swift4 进行混编项目的开发.

然而每每使用低版本的 Xcode 打包上传 APPStore 时, 就会收到苹果的官方警告邮件

OC与Swift混编项目迁移到Swift4.2小记

如邮件内容所示, 到 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:));

@end

NS_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
复制代码

然后在你项目的 <#target_name#>-Bridging-Header.himport 这个分类:

#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 类, 但是却继承自 Object-C 声明编写的类. 我在自己试过一些微调之后发现于事无补, 所以只好将出错的类使用 Object-C 重写, 然后在桥接文件中引入, 好在报错的不多, 没用费太多力气.

其他奇怪的错误

迁移完成后 项目跑起来时, 还会出现很多奇怪的问题. 比如调用了某个方法A 会报 unrecognize selector * , 以及莫名的 函数调用 , 如:

OC与Swift混编项目迁移到Swift4.2小记

(setupNavibar函数中并没用调用任何初始化构造函数)

这类错误, 一般跟以上的俩种问题是一个本质, 需要自己仔细区别, 然后做出相应更新/更改即可.

除开以上的问题, 项目编译时还会在 Pods 引用的第三方的类中报ABI需要修改的 Error , 这时, 只需要找到队形的 Target , 在其 Build Settings 中修改 Swift Language Version 为其对应版本即可.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法设计手册

算法设计手册

斯基恩纳 / 清华大学出版社 / 2009-9 / 69.00元

《算法设计手册(第2版)》是算法设计畅销书的最新版本,是设计实用且高效算法的最全面指导书。《算法设计手册(第2版)》揭密了算法的设计与分析,以简单易懂的写作风格,介绍了各种算法技术,着重强调了算法分析,全书包括两大部分,“技术”部分介绍了设计和分析计算机算法的各种方法,“资源”部分给出了大量的参考资源,以及算法实现的各种资源,此外,在作者的个人网址http://www.CS.sunysb.edu/......一起来看看 《算法设计手册》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具