我正在构建这个Swift静态库:OxfordLibrary
我最终想使用 XCFramework 分发它。
我有一些想要从 Swift 访问的 ObjC/C++ 代码。由于我们不能在静态库中使用 ObjC 桥接头(创建 XCFramework 时抛出错误),所以我尝试使用模块映射文件。
所以想法是将 ObjC/C++ 代码库保持在库内部/私有,并且只通过 Swift 公开 API。
所以我创建了以下内容:
/// FILE: module.modulemap
module OxfordLibrary {
export *
}
/// FILE: module.private.modulemap
module OxfordLibrary_Private {
umbrella header "OxfordLibrary-objc-umbrella.h"
export *
}
我已经设置并在构建设置中Defines Module: YES
设置了 swift 。Seach Path
现在在我的主要 Swift 文件中:
/// FILE: OxfordLibrary.swift
#import OxfordLibrary_Private
open OxfordLibrary{
public static func foo() {
SomeObjcClass.someObjcMehtod() // Final aim
}
}
现在如果不导入OxfordLibrary_Private
,我将无法SomeObjcClass
快速访问。美好的。添加导入后它可以工作。
这甚至可以正确构建。
但是,当我从中创建 XCFramework 并将该 XCFramework 导入到客户端应用程序项目时,import OxfordLibrary
它会抛出错误OxfordLibrary_Private
模块未找到/未定义。
在做了一些研究之后,我发现我需要在 Modules 文件夹中或使用 -headers 标志将模块映射文件和头文件复制到 XCFramwork。如果我这样做,它会起作用。
但问题是:它的 private.modulemap 应该是私有的并且在库之外不可用?
因为现在我可以import OxfordLibrary_Private
在客户端应用程序中进行操作并在那里访问任何 ObjC 方法。