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

时间:2015-11-17 02:40:45

标签: objective-c swift frameworks

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我成功地使用显式声明的模块作为Objective-C的这个问题的解决方案 - >斯威夫特案。我没有将模块声明分成单独的私有模块映射,但是在同一个模块映射中声明了框架模块和显式模块,因为问题的一个注释中引起了关注(我不确定它是否或如何可以使用同一框架内私有模块映射生成的头。

这是我为MPFoundation.framework定义的模块映射的摘录,其中包含一个显式模块MPManuscriptCompiler_Protected,它导入标题"MPManuscriptCompiler+Protected.h",该标题未包含在框架的标题中:< / p>

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"可以在框架中标记为私有或项目级别标头,因此它不会在伞形标题中显示,也不会可用于基于标头的导入及其文件名。因此,这可以解决必须在伞头中包含此标头。

然而,以这种方式创建的模块在框架中公开暴露,并且可供不应该看到的眼睛使用。我没有进一步调查,因为这实际上解决了这个问题(我还没遇到问题,我偶然会导入那个不应该被导入的受保护的标题)。