Swift静态库中包含OC - ShenYj/ShenYj.github.io GitHub Wiki

Swift静态库中包含OC

在作为 framework 开发时,如果存在 SwiftOC混编,由于 framework 中无法使用桥接文件, 就可以利用 Module来实现

在 framework 项目下使用 bridge 会编译报错

error: using bridging headers with framework targets is unsupported
Command CompileSwiftSources failed with a nonzero exit code

framework 中使用了 Module, 那么默认所有 Module 都是暴露的

单纯的将头文件放在private中也是无效的,会导致同属一个framework target下的 Swift 文件也无法使用 OC文件

如果需要控制其模块的可见性,需要通过 private.modulemap

  • e.g.

    framework module A_Private {
        header "A.h"
        export *
    }
    • 私有module的命名有规定, 必须要以_Private结尾,并且 P 是大写

类似于 .modulemap 那样

  1. 创建一个 xxx.private.modulemap 的文件
  2. build setting - Private Module Map File 中配置路径不希望被暴露出去的 Module

.private.modulemap 也并不是真正意义上的私有,而是在使用 Module 时进行区分,无法直接根据 A.Module访问到私有部分,但是仍然可以通过 XXX_Private.xxx来访问到

如果想要在 Swift framework中彻底对外隐藏掉 oc 文件, 还可以考虑将 oc的方法封装一层 protocol,暴露给swift使用,作为framework 对外暴露 Swift api和这一层 protocol

⚠️ **GitHub.com Fallback** ⚠️