Objective C中的公共和私有伞标题

pur*_*020 13 frameworks objective-c swift

我有这个代码库,它是Objective C和Swift mix.有些地方Swift使用Objective,反之亦然.我现在需要创建一个基于此代码库的框架,但不希望在我的伞形头中包含所有目标c文件.这是我的问题:

在我的框架内,我仍然需要能够使用来自objc的swift,反之亦然; 但是不希望暴露swift类在内部使用的所有objc文件.框架中不允许桥接头,因此swift所需的所有头文件都需要放在伞头中.

我想知道是否有可能让内部swift代码所需的所有objc头文件都放在一个文件中,这个文件将是我的私有伞头文件,我需要公开的所有文件都将放在公共伞形标题中.

有什么建议?

mz2*_*mz2 4

我成功地使用显式声明的模块作为 Objective-C -> Swift 情况下此问题的解决方案。我没有将模块声明分离到单独的私有模块映射中,而是在同一模块映射中声明了框架模块和显式模块,因为对该问题的评论之一提出了担忧(我不确定是否或如何它可以使用同一框架内的私有模块映射生成的标头)。

以下是我为 MPFoundation.framework 定义的模块映射的摘录,其中包括一个显式模块,该MPManuscriptCompiler_Protected模块导入"MPManuscriptCompiler+Protected.h"未包含在框架的总括标头中的标头:

framework module MPFoundation {
    umbrella header "MPFoundation.h"

    export *
    module * { export * }

    explicit module MPManuscriptCompiler_Protected {
        header "MPManuscriptCompiler+Protected.h"
        export *
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在 Swift 子类中使用这个显式模块 MPManuscriptCompiler_Protected,该模块存在于同一框架中,如下所示:

import MPFoundation.MPManuscriptCompiler_Protected
Run Code Online (Sandbox Code Playgroud)

我的解决方案实际上在技术上只是一种解决方法:要使其工作,"MPManuscriptCompiler+Protected.h"可以在框架中标记为私有或项目级标头,因此它在伞式标头中不可见,并且不可用于基于标头的导入及其文件名。因此,这可以解决必须将此标头包含在伞标头中的问题。

然而,以这种方式创建的模块在框架中公开公开,并且可供不应该看到它的人看到。我没有进一步调查这个问题,因为实际上这很好地解决了这个问题(我还没有遇到问题,我会意外地将受保护的标头导入到不应该导入的地方)。