objective-c - Objective C 中的公共(public)和私有(private)伞头

标签 objective-c swift frameworks

我有这个代码库,它是 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/

相关文章:

ios - 非零整数值的核心数据 EXC_BAD_ACCESS

objective-c - OCMock 模拟协议(protocol)的静态类方法。

iphone - UIViewController 的高度设置为 460

ruby - Ruby 的最佳 GUI 框架。不是鞋子

php - 错误 : 1215 Cannot add foreign key constraint 的问题

java - 如何使用SpringFuse?

iphone - UILocalNotification 应用角标(Badge)编号重复

ios - 如何在 Swift 3 中解析来自 URL 的 JSON 数据

xcode - Swift 将代码转换为组件以便多次使用

ios - UIImagePickerController 第一次打开时速度很慢,双击时除外