为什么要混编?

  • 语言发展趋势(TIOBE),Swift 排行持续上升, OC 排行呈重力下降
  • 项目正常迭代需要 
  • 很多第三方库仍然使用 OC 实现
  • 项目中原来已经用 OC 实现的模块如果使用 Swift 重写,代价稍大
  • 我们需要在项目中使用 Swift 才能真正碰到问题,解决问题

注:不是为了混编而混编。混编只是在对开发资源、项目管理和技术发展趋势进行综合衡量之后做出的比较合理的选择。

如何开始混编?

步骤

  1. 创建工程,Language 选择 Swift 或 Objective-C 都可以。
  2. oc 和swift 的区别 oc和swift混合开发_发展趋势

  3. 创建 Swift 文件并添加 bridging header 文件
  4. oc 和swift 的区别 oc和swift混合开发_开发资源_02

  5. 添加 Swift 文件时 Xcode 会自动提示你添加 bridging header 文件,选择 Yes 即可
  6. 进行两处关键设置
  7. oc 和swift 的区别 oc和swift混合开发_Code_03

  8.  
  9. oc 和swift 的区别 oc和swift混合开发_oc 和swift 的区别_04

  10. 这两处设置 Xcode 默认都会设置好,可以把 Objective-C Bridging Header 和 Objective-C Generated Interface Header Name 改成自己想设置的名字。

至此Swift 与 Objective-C 混编的环境就算配置完成了。

XXX-Bridging-Header.h

import

XXX-Swift.h

和 XXX-Bridging-Header.h 不同,XXX-Swift.h 文件不会出现在项目中,而是由 Xcode 自动生成,你可以在类似如下的路径下找到相应项目的 XXX-Swift.h 文件:(PS:演讲时没有写到PPT里面,实在抱歉)


<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">/Users/perry/Library/Developer/Xcode/DerivedData/XXX<span class="hljs-attribute" style="box-sizing: border-box;">-bhlzdinkujybftbjmgwjwclndmss</span>/Build/Intermediates/XXX<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>build/Debug<span class="hljs-attribute" style="box-sizing: border-box;">-iphonesimulator</span>/XXX<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>build/Objects<span class="hljs-attribute" style="box-sizing: border-box;">-normal</span>/x86_64/XXX<span class="hljs-attribute" style="box-sizing: border-box;">-Swift</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>h</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


#import XXX-Swift.h

查看 XXX-Swift.h 文件中的代码:


oc 和swift 的区别 oc和swift混合开发_oc 和swift 的区别_05

不难发现这个文件中的内容其实是将 Swift 中的代码转换成了 OC 的代码。

注:如果对项目进行清理操作,这个文件也会被删除,而且在重新构建的过程中,只有在所有的 Swift 代码都编译通过的情况下才会重新生成这个文件。

结合框架的混编


oc 和swift 的区别 oc和swift混合开发_开发资源_06