老旧历史工程添加OC-Swift混编-超快速集成指南

老旧历史工程添加OC-Swift混编-超快速集成指南

截止写稿,Swift 已经更新到 5.2 版本了。算是比较稳定的版本了,也确实可以加入到目前的工程中来,发挥swift的性能优势。

乘着新需求开发,也想能够实际使用下Swift,为了以后的纯Swift工程做准备。

一、Swift跟OC桥接分为2种情况

  • OC类调用Swift类

1.1 在OC类中必须先导入头文件appname-swift.h(appname是您的工程名)该文件不可见,但可以import点进去查看。

appname-swift.h

1.2 这个文件里面大致是一点宏定义,然后你新建的Swift文件,都会生成在这个文件里面

1.3 这个文件是系统自动生成的,无需自己修改

唯一需要配置的就是在 Build Settings里面Objective-C Generated Interface Header Name里面配置下

Build Settings-Objective-C Generated Interface Header Name
  • Swift调用OC类

2.1 在Swift类中必须在import头文件appNme-Bridging-Header.h(如果文件是自动生成的,appName一般为工程名)

2.2 如果你工程是oc工程,那么这个头文件在你第一次新建一个swift文件的时候,系统会提示你,是否要生成。

若是swift工程,那么在你第一次新建oc文件的时候,会提示。图示是oc工程第一次新建swift文件

create swift file

2.3 若是选择了,没有自动生成,那么也不用担心,你可以自己新建一个头文件,命名可以自由,也可以按照系统那种样式,然后去 Build Settings 里面进行配置 Objective-C Bridging Header, 然后设置这个文件正确的路径

Build Settings - Objective-C Bridging Header

2.4 appNme-Bridging-Header.h文件中就是引入oc类的头文件,供swift调用,一般内容是这样的

appNme-Bridging-Header.h

以上算是成功把工程进行了混编

二、一些注意点

  1. 若是项目是自己制作的cocoapods的库,或是提供给其他人使用的组件代码,那么建议到Target - - Build Settings--Packging--Defines Module,将值改为YES。
    如果设置为YES,会认为项目自定义自己的组件,允许项目通过组件的方式引入。
    不是的话,也可以设置这个值,因为对本身工程没有其他影响。
Defines Module
  1. 针对编译优化,还有一个设置,需要我们设置
    在User-Defined里添加SWIFT_WHOLE_MODULE_OPTIMIZATION = YES可以在debug选择Onone。可以加快我们debug调试时候的编译速度,具体原理可以自行搜索下。简单来说就是将所有文件合在一起编译,每次通过编译缓存,只编译每次修改的内容,从而加快了编译速度。
    release 可以选择其他的编译优化选项。
SWIFT_WHOLE_MODULE_OPTIMIZATION
  1. 个人发现,方法中带NS_REQUIRES_NIL_TERMINATION ,swift 无法调用 objc 中有参数个数不定的方法,可能需要修改oc中的方法名跟入参。

4.写入appNme-Bridging-Header.h中的oc类,这些类之间的引用也要相互理清,若是存在相互引用,会编译报错。

5.若你的工程是用cocoapods引用第三方库的(一般都是),那么podfile文件中记得添加

use_frameworks!

然后还有一些常用的swift库

到这里,基本是混编工程已经完成后,后续就是新增你的swift类,开始写页面。

最重要的是更换下oc的思路,开始swift的学习。

你可能感兴趣的:(老旧历史工程添加OC-Swift混编-超快速集成指南)