在<project name =“”>的实现中,模块'<module name =“”>'的Swift @import;使用#import

时间:2016-06-28 14:29:07

标签: swift xcode module clang

我正在尝试创建一个混合的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个标头然后所有要暴露的标头更容易(因为您需要包含标头的特定路径......)。 / p>

我的构建设置如下:

  • DEFINES_MODULE:是
  • PRODUCT_MODULE_NAME:MyCore
  • CLANG_ENABLE_MODULES:是
  • SWIFT_OBJC_INTERFACE_HEADER_NAME:MyCore-Swift.h
  • SWIFT_INCLUDE_PATHS module.modulemap
  • 目录的路径

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

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

what is this error?

现在点击错误会将我带到生成的MyCore-Swift.h @import MyCore.MyCorePrivate看似错误。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

4)编译项目

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

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

7)删除框架标题

中应该是私有的所有import语句

8)删除所有.h 文件,以查找应该从headers目录中保密的标头(您从主框架标头中删除了import语句)

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

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

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