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 文件中添加这个导入,就可以解决这个问题了.