1.背景
外包项目(OC)交接完毕,需要把另一个swift的项目的部分(很多)页面加入到这个外包项目中。有两种解决方案
一、将swift的代码变成OC的代码,即照着swift的代码写成OC的代码(呵呵了,写了两星期,放弃主要是没服务器接口也没法调试,总不能开着青花瓷模拟数据吧,自己也懒得写模拟数据,天知道OC要写多少个@,)
二、OC与Swift混编(可能会有坑,但是比较简单,一劳永逸),那就接下来踩坑吧!
2.OC与swift混编坑
1.引入 文件名-Bridging-Header.h 桥接文件
创建swift文件的时候会有提示,也可以自己创建,具体可参照iOS开发之OC与Swift混编,这一步没有什么问题。
2.import 问题
原来的开始引入swift项目中的文件,发现#import <MagicalRecord/MagicalRecord.h> 等引入的头文件报错,百度之后了解需要改成#import "MagicalRecord/MagicalRecord.h" ,不能使用<>的形式,搜索代码将<>的形式改成“”,系统的不用改,cocopods的里面的也不用改。
3.cocopods引用swift三方库
swfit项目中有用到了一些三方库,
如Snapkit,如果直接在podfile里面写的话会有问题,这时候需要了解useFrameworks,不绕弯子,直接贴答案Podfile中的 use_frameworks!
直接给结论:
纯swift项目中使用cocopods ,PodFile必须使用 use_frameworks!
纯oc项目中默认使用 #use_frameworks!
swift+oc中使用 #use_frameworks!
oc+swift项目中,老老实实的把三方库文件拽到项目里来吧。如下:
4.项目某个.h文件报错
貌似是引入swift项目之后编译比较严格了,我的报错文件里提示我少属性或者方法,但是我查到那个文件是是不缺少的,这就尴尬了,我相信xcode是不会骗我的,我的眼睛也不会骗我的,那么真相只有一个,在这个项目下有可能有两个相同的名称的文件,这两个文件由于删除的时候只是移除了依赖,并没有删除掉,在没有引入swift之前编译不严格,所以没有问题,引入swift之后,编译严格了所以把它引入了。
打开Finder在项目下搜索报错的文件名,果然有数个一样的,删掉错误的之后,果然就好了,当然有好几个相同的文件,统统删掉,编译,succeed!nice!
总结:混编之前代码先备份!备份!备份!
use_frameworks!原文:
A、用cocoapods 导入swift 框架 到 swift项目和OC项目都必须要 use_frameworks!
B、使用 dynamic frameworks,必须要在Podfile文件中添加 use_frameworks!
(1)如果在Podfile文件里不使用use_frameworks! 则是会生成相应的.a文件(静态链接库),通过staticlibraries这个方式来管理pod的代码。 (2)Linked:libPods-xxx.a包含了其它用pod导入的第三方框架的.a文件。(3)如果使用了use_frameworks! 则cocoapods会生成相应的.frameworks文件(动态链接库:实际内容为Header+ 动态链接库 + 资源文件),使用dynamicframeworks来取代staticlibraries方式。 (4)Linked:Pods_xxx.framework包含了其它用pod导入的第三方框架的.framework文件。
use_frameworks! -> dynamic frameworks 方式 -> .framework
#use_frameworks! -> static libraries 方式 -> .a
关于Library 和 Framework 可以参考:
http://blog.lanvige.com/2015/...
(1)swift项目cocoapods 默认 use_frameworks!(2)OC项目cocoapods 默认 #use_frameworks!
用cocoapods导入OC框架到swift项目:
(1)#use_frameworks! 必须创建头文件,在头文件里面 #import "AFNetworking.h"
(2)use_frameworks! 如果有头文件,在头文件里面 #import "AFNetworking/AFNetworking.h",其它swift文件中用到不需要再import;如果没有头文件,则在每个需要用到的swift文件里 import AFNetworking。
用cocoapods导入swift框架到swift项目:
(1)必须use_frameworks!
(2)不需要头文件,在需要用到框架的swift文件里 import Alamofire
用cocoapods导入OC框架到OC项目:
(1)#use_frameworks! 在需要用到的文件里 #import "AFNetworking.h";也可以通过pch文件,用法类似swift中的头文件。
(2)use_frameworks! 与(1)类似,用法上没有区别。
用cocoapods导入swift框架到OC项目:不考虑
总结:
(1)用swift项目考虑到会使用 OC 和 swift 两种第三方框架,所以Podfile中使用swift项目默认的 use_frameworks! 更为妥当,并且frameworks动态链接库具有一定的优势。
(2)可以建立一个Bridge头文件,用来import那些OC框架的.h文件:#import "xxx/xxx.h"。或者不建头文件,像swift框架一样,直接在需要用到的swift文件中import。