在 <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_PATHS
:module.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 <SomeClass>
转发其他文件。
我在生产交付框架中有这个解决方案。你一定在某个地方有错误。按照以下步骤在一个带有虚拟文件的空框架项目上运行测试。
我刚刚公开了一切,有点生气。现在唯一的错误(非模块化错误)来自sqlite3.h
,我怎样才能将它也公开?
天哪,终于成功了。我刚刚做了一个新项目,并按照您的步骤进行操作。我完全不知道为什么现在这样有效,因为我之前已经做过同样的事情。也许是因为我添加了将 sqlite3 作为最后一个导入新项目的单个类?也许是因为 XCode 讨厌我?也许是因为月亮是圆的?我不知道。以上是关于在 <Project name> 的实现中模块'<module name>' 的 Swift @import;使用#import的主要内容,如果未能解决你的问题,请参考以下文章