module.map 用于从测试目标访问主目标中的(Swift 和 Objective-C)类

Posted

技术标签:

【中文标题】module.map 用于从测试目标访问主目标中的(Swift 和 Objective-C)类【英文标题】:module.map for accessing (Swift and Objective-C) classes in main target from test target 【发布时间】:2015-01-28 06:54:40 【问题描述】:

我正在将 Swift 类添加到现有的 Objective-C 项目中。作为其中的一部分,我在目标MyProjectTests 中添加了一个MyProjectTests.swift。它从目标 MyProjectimport MyProject 导入 Swift 类,效果很好。

我现在也想在MyProjectTests.m 中使用@import Swift;。但是,编译器会发出错误Module 'MyProject' not found

我有这些问题:

使 import 和 @import 在测试目标中都成功

为什么 Swift 编译器可以看到模块 MyProject 而 Objective-C 编译器却没有?我必须更改MyProjectTest 中的哪些构建设置才能使@import MyProject 也成功。

从主要目标导出 Objective-C 类

最终MyProjectTest.swiftMyProjectTest.m 也需要从目标MyProject 访问Objective-C 类。到目前为止,我已经针对此类文件进行了多目标处理,但我也想在这里切换到使用模块。

我目前的理解是,这是提供一个module.map 文件的问题,该文件将列出我希望“导出”的类的头文件。

我必须执行哪些具体步骤?在MyProjectMyProjectTests 两个目标中,我应该将头文件放置在哪里以及需要更改哪些构建设置?

我目前在我的项目中有一个(目前为空)module.map,目标MyProject 的构建设置包括Defines Module: YesProduct Module Name: MyProject

更新我现在想知道是否不可能将 ios 应用程序(而不是 framework)项目中的 (Objective-C) 文件作为模块公开。但它似乎已经适用于 Swift 文件(不知何故)。

【问题讨论】:

【参考方案1】:

我现在已经得出结论,当前的 Xcode (6.1.1) 工具无法做到这一点。 (真是浪费时间!)

将源文件双向定位到 MyProjectMyProjetTest 的旧方案也为具有大量代码的混合 Objective-C/Swift 项目带来了一些挑战:

它的 Objective-C 部分定义了一个旧版 NS_ENUM(Integer, Repeat),它与 Swift.Repeat<T> 名称冲突。将其称为MyProject.Repeat(不是MyProjectTests.Repeat)在为目标MyProjectTests 编译时会导致问题,将这个目标的Project Name(也)更改为MyProject(不是:MyProjectTests)似乎无法解决。

编译其中 Swift 类 A 使用 Objective-C 类 B,而后者又使用 Swift 类 C 的结构似乎无法以直接的方式进行。由于编译器还没有产生MyProject-Swift.h 定义为C,它不能编译B。但由于它不能编译B,它不能编译A,因此不能产生MyProject-Swift.h。 Catch 22,或者看起来是这样。

双向 Swift 代码从自动生成的 MyProject-Swift.h 导入 Swift 类。对于目标MyProjectTests,此名称不适用,但这就是它在源文件中的名称。我不想走改变MyProjectTests'Project Name(见上文)的道路。通过目标*.pch 导入正确的自动生成的文件可能是可能的,但它可能不是...

【讨论】:

以上是关于module.map 用于从测试目标访问主目标中的(Swift 和 Objective-C)类的主要内容,如果未能解决你的问题,请参考以下文章

iOS 测试目标无法识别主应用程序的文件

如何从 Swift 单元测试访问测试目标中存在的 Objective-C 代码?

使用 KIF 访问另一个目标中的类

从主应用程序目标 SwiftUI 访问 WidgetKit IntentTimelineProvider

从 XCode UI 测试目标访问项目文件

访问 OCUnit 测试目标中的 UIImage