我有这个代码库,它是 Objective C 和 Swift 的混合体。有些地方 Swift 使用 Objective,反之亦然。我现在需要基于此代码库创建一个框架,但不想在我的伞形 header 中包含所有 objective-c 文件。这是我的问题:
在我的框架内,我仍然需要能够从 objc 使用 swift,反之亦然;但不想公开 swift 类在内部使用的所有那些 objc 文件。框架中不允许桥接 header ,因此 swift 所需的所有 header 都需要放在伞形 header 中。
我想知道是否有可能将内部 swift 代码所需的所有 objc header 放入一个文件中,该文件将成为我的私有(private)伞形 header ,而我需要公开的所有文件将进入公共(public)伞形 header 。
有什么建议吗?
最佳答案
对于 Objective-C -> Swift 案例,我成功地使用显式声明的模块作为此问题的解决方案。我没有将模块声明分离到一个单独的私有(private)模块映射中,而是在同一个模块映射中声明了框架模块和一个显式模块,因为在对问题的评论之一中提出了担忧(我不确定它是否或如何可以在同一框架内使用由私有(private)模块映射生成的 header )。
这是我为 MPFoundation.framework 定义的模块映射的摘录,其中包括一个显式模块 MPManuscriptCompiler_Protected
,它导入 header "MPManuscriptCompiler+Protected.h"
不包含在框架的伞头中:
framework module MPFoundation {
umbrella header "MPFoundation.h"
export *
module * { export * }
explicit module MPManuscriptCompiler_Protected {
header "MPManuscriptCompiler+Protected.h"
export *
}
}
然后我在我的 Swift 子类中使用这个显式模块 MPManuscriptCompiler_Protected,它存在于同一框架中,如下所示:
import MPFoundation.MPManuscriptCompiler_Protected
我的解决方案在技术上实际上只是一种变通方法:为了使其工作,"MPManuscriptCompiler+Protected.h"
可以在框架中标记为私有(private)或项目级 header ,因此它不会在伞形 header 中可见,并且不可用于基于 header 的导入及其文件名。因此,这解决了必须将此 header 包含在伞形 header 中的问题。
但是,以这种方式创建的模块在框架中是公开暴露的,并且可供不应该看到它的眼睛使用。我没有进一步调查这个问题,因为实际上这已经很好地解决了这个问题(我还没有遇到我会不小心将 protected header 导入到不应该导入的地方的问题)。
关于objective-c - Objective C 中的公共(public)和私有(private)伞头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33748227/