我正在开发一个 Swift Cocoapod 库,它实际上是一些 Objective C 代码的包装器。我的目标是只公开库的 Swift 部分,同时使 Objective C 尽可能私有。然而,由于 Swift 部分是 Objective C 代码的包装器,它需要访问它,尽管只是在内部。
我已经搜索并尝试了各种方法,但它们都没有奏效。
首先,我尝试通过使用模块映射文件来解决它。这个想法是创建一个 Swift 模块,称为MyLibrary
包含所有 Swift 代码的东西,而 Objective C 代码将在MyLibrary.Private
模块上(我知道模块仍然可以访问,但这种分离对我来说已经足够了)。模块映射看起来像:
//MyLibrary.modulemap
framework module MyLibrary {
module Private {
header "MyObjectiveC.h"
export *
}
}
MyLibrary.podspec
并在文件中添加以下行
s.module_map = 'path/to/MyLibrary.modulemap'
但是,通过使用这种方法,即使我只导入MyLibrary
模块仍然可以访问所有的 Objective C 类,而不必导入MyLibrary.Private
模块来这样做。
我尝试的第二种方法是使用private.modulemap文件。所以我最终会得到两个不同的模块映射文件:
//MyLibrary.modulemap
framework module MyLibrary {}
//MyLibrary.private.modulemap
module MyLibrary.Private {
header "MyObjectiveC.h"
export *
}
MyLibrary.podspec
然后我会在文件中添加以下行
s.pod_target_xcconfig = { 'MODULEMAP_PRIVATE_FILE' => '$(PODS_ROOT)/MyLibrary/path/to/MyLibrary.private.modulemap' }
但是,我得到一个失败的构建,说明它找不到MyLibrary.Private
模块。
在这些方法中我做错了什么吗?或者有没有其他方法可以让我的库的 Swift 类私下访问 Objective C 类而不暴露那些,至少明确地,需要*.Private
为它导入特定的模块?