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

module.map for accessing (Swift and Objective-C) classes in main target from test target

我正在将 Swift 类 添加到现有的 Objective-C 项目中。作为其中的一部分,我向目标 MyProjectTests 添加了一个 MyProjectTests.swift。它使用 import MyProject 从目标 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 文件的问题,该文件将列出我希望 "export" 的 类 的头文件。

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

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

UPDATE 我现在想知道是否无法从 iOS 应用程序(而不是 framework) 项目作为一个模块。但是它似乎已经适用于 Swift 个文件(不知何故)。

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

针对 MyProjectMyProjetTest 的双目标源文件的旧方案也对具有大量代码的混合 Objective-C/Swift 项目提出了一些挑战:

  • 其 Objective-C 部分定义了与 Swift.Repeat<T> 名称冲突的遗留 NS_ENUM(Integer, Repeat)。将其称为 MyProject.Repeat(而不是 MyProjectTests.Repeat)会在为目标 MyProjectTests 编译时导致问题,这会将此目标的 Project Name(也)更改为 MyProject(不是: MyProjectTests) 好像没有解决。

  • 构造的编译,其中 Swift class A 采用 Objective-C class B,后者又采用Swift class C 似乎无法以直接的方式实现。由于C的定义编译器还没有生成MyProject-Swift.h,所以无法编译B。但由于它无法编译 B,因此无法编译 A,因此无法生成 MyProject-Swift.h。赶上 22,似乎是这样。

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