首页 文章

模块'<module name>'的Swift @import实现<Project name>;使用#import

提问于
浏览
5

我正在尝试创建一个混合的ObjC-Swift框架 . 但是我试图为我的Swift文件制作一个私有模块,我失去了很多头发 .

我在iOS mixed dynamic framework - bridge objc headers with private module中执行了一些步骤并结合了https://stackoverflow.com/a/36878037/749438中的一些步骤

基本上我现在有一个module.modulemap,其中包含以下内容:

module MyCore {    //Adding 'framework' before module is giving me an "Umbrella not found"-error :/
umbrella header "MyCore.h"

export *
module * { export * }

explicit module MyCorePrivate {
    header "MyCore_PrivateUmbrella.h"
    export *
}

}

MyCore_PrivateUmbrella.h 导入我想私下向我的Swift代码公开的所有头文件 . 其背后的原因只是在模块中包含1个 Headers 然后所有要显示的 Headers 更容易(因为您需要包含 Headers 的特定路径...) .

我的构建设置如下:

  • DEFINES_MODULE :是的

  • PRODUCT_MODULE_NAME :MyCore

  • CLANG_ENABLE_MODULES :是的

  • SWIFT_OBJC_INTERFACE_HEADER_NAME :MyCore-Swift.h

  • SWIFT_INCLUDE_PATHSmodule.modulemap 目录的路径

最后但并非最不重要; ALWAYS_SEARCH_USER_PATHS 设置为NO

在我的Swift文件中,我使用 import MyCore.MyCorePrivate 导入模块 . 这按预期工作,我可以使用Objective-C中的代码 .
构建项目会给我一个这样的错误(黑条只隐藏项目名称和文件路径):

what is this error?

现在单击错误会将我带到生成的 MyCore-Swift.h ,其中 @import MyCore.MyCorePrivate 看似错误 .

我不知道为什么这是错的,我也不知道如何解决这个问题 . 特别是因为它是由XCode生成的文件 .

有谁知道这里发生了什么?

1 回答

  • 1

    构建之后,您需要修改生成的框架:

    1)不要创建任何私有模块 . 恢复默认设置 .

    2)您希望向swift公开的任何代码添加到您的框架标头并确保标头在构建部分中设置为公共,否则swift代码将无法访问 . (使用<>语法)

    3)从swift到objc的任何代码都公开 .

    4)编译你的项目

    5)转到你的框架构建目录(即MyFramework.framework)

    6)在框架的headers目录中打开框架头文件(Myframework.h文件)

    7)删除框架头中应该是私有的所有import语句

    8)从headers目录中删除所有应该是私有的头文件的所有.h files (从主框架头中删除了import语句)

    9)转到.module文件并删除swift模块部分

    模块文件应该是非常简单的:

    framework module MyFramework { 
    umbrella header "MyFramework.h" export * module * {export *}}
    

相关问题