OC和Swift混编Frameowork优雅指南

cover 本文主要参考了优雅地开发Swift和Object C混编的Framework。不过实际发现,完全按照文章里面”优雅的解决方案“里面的说法操作,还是没法成功。我这里根据实际情况作出了调整。

  1. 参考的文章中在“优雅的解决方案”这个section之前的内容都是好用的,你可以用用来创建一个兼容OC和Swift的Cooca Touch Framework。
  2. 这里说的“优雅”,指的是控制OC部分接口保留的问题(详情可以参考原文部分)

原文里面只说了具体的操作步骤,没有高屋建瓴地说出这种方法的实际思路:事实上,采用module.modulemap的方法是将OC部分打包成一个可以使用Swfit语句进行导入(import)的模块。以这个视角,我们再来梳理一下操作步骤:

0.0.1 新建一个module.modulemap文件

文件里的内容如下:

1
2
3
4
5
module OCSource [system] {
//由于module.modulemap和OCSource.h是在同一个文件夹的,如果不是同一个,路径要写全
header "OCSource.h"
export *
}

有一个容易犯错的问题是将这里的模块名字, OCSource命名为了Cocoa Touch Framework的名字。这样会导致编译出错,错误信息会提示你Module名字重复定义。这里的名字要区别的Framework的名字,具体是什么可以自己自由选择。不过推荐和头文件的名字一致

后一步操作是把module.modulemap的路径添加到Build Settings的Import Paths中,这是为了让我们在Swift里面import这个module的时候能够找到目标.

Import Paths in Build Settings

那么,这里的$(SRCROOT)/MixFramework其实就是指的module.modulemap的路径。

0.0.2OCSouce.h文件的权限改为project

Header Visibility Settings

这可以让OCSource.h不再对外可见。 然后,删除MixFramework.h(umbrella header)中#import 的OC header。


原文的内容到此结束,但是其实还是不够的。这时候如果编译,会发现你在Framework内部的Swift使用OCSource的地方都会报错说OCSource不存在。因为将OCSource.h从umbrella header中删除之后Swift就无法看到这个文件了。然而,通过module.modulemap文件我们将OCSource.h及相关的OC文件打包成了了一个Swift模块,因此我们可以在Swift代码中import进来:

1
import OCSource

在报错的Swift文件中添加这个导入,就可以解决这个问题了.