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

Posted

技术标签:

【中文标题】在 <Project name> 的实现中模块\'<module name>\' 的 Swift @import;使用#import【英文标题】:Swift @import of module '<module name>' in implementation of <Project name>; use #import在 <Project name> 的实现中模块'<module name>' 的 Swift @import;使用#import 【发布时间】:2016-06-28 14:29:06 【问题描述】:

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

我遵循了ios mixed dynamic framework - bridge objc headers with private module 中的一些步骤以及https://***.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 个标头然后 all 要公开的标头更容易(因为您需要包含标头的特定路径...)。

我的构建设置如下所示:

DEFINES_MODULE:是的 PRODUCT_MODULE_NAME: 我的核心 CLANG_ENABLE_MODULES:是的 SWIFT_OBJC_INTERFACE_HEADER_NAME: MyCore-Swift.h SWIFT_INCLUDE_PATHSmodule.modulemap的目录路径

最后但同样重要的是; ALWAYS_SEARCH_USER_PATHS 设置为否

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

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

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

有人知道这里发生了什么吗?

【问题讨论】:

你在分发一个封闭源代码的框架吗?如果没有,那么拥有私有 swift 模块是没有意义的,因为 swift 代码在内部具有访问级别 计划就是这样。该框架将分布在我希望将(大部分)标题保持私有的地方。 【参考方案1】:

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

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

2) 任何你想暴露给 swift 的代码都添加到你的框架头文件中,并确保头文件在构建部分被设置为公共,否则 swift 代码将无法访问。 (使用 语法)

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

4) 编译你的项目

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

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

7) 从框架头中删除所有应该私有的导入语句

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

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

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

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

【讨论】:

另外请注意,如果您将封闭源代码框架分发给其他人在开发过程中使用,您将需要创建一个通用二进制文件,以便您的框架可以在他们的模拟器和他们的设备上运行。 我试过这样做(实际上是我开始迁移到 Swift 时做的第一件事),但我一直收到 "Include of non-modular header inside framework module" 错误;正如我在我的问题中发布的那样,该错误最终导致我找到了解决方案。我还检查了我项目中的每个#import。我确保我只在标题中导入了必要的文件(例如协议),并使用@class &lt;SomeClass&gt; 转发其他文件。 我在生产交付框架中有这个解决方案。你一定在某个地方有错误。按照以下步骤在一个带有虚拟文件的空框架项目上运行测试。 我刚刚公开了一切,有点生气。现在唯一的错误(非模块化错误)来自sqlite3.h,我怎样才能将它也公开? 天哪,终于成功了。我刚刚做了一个新项目,并按照您的步骤进行操作。我完全不知道为什么现在这样有效,因为我之前已经做过同样的事情。也许是因为我添加了将 sqlite3 作为最后一个导入新项目的单个类?也许是因为 XCode 讨厌我?也许是因为月亮是圆的?我不知道。

以上是关于在 <Project name> 的实现中模块'<module name>' 的 Swift @import;使用#import的主要内容,如果未能解决你的问题,请参考以下文章

CMake中project的使用

cmake学习之-project

创建回调函数

未定义的索引:Project_Name [关闭]

170421maven自定义变量及属性

CMake Cookbook by Eric