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
。它从目标 MyProject
和 import MyProject
导入 Swift 类,效果很好。
我现在也想在MyProjectTests.m
中使用@import Swift;
。但是,编译器会发出错误Module 'MyProject' not found
。
我有这些问题:
使 import 和 @import 在测试目标中都成功
为什么 Swift 编译器可以看到模块 MyProject
而 Objective-C 编译器却没有?我必须更改MyProjectTest
中的哪些构建设置才能使@import MyProject
也成功。
从主要目标导出 Objective-C 类
最终MyProjectTest.swift
和MyProjectTest.m
也需要从目标MyProject
访问Objective-C 类。到目前为止,我已经针对此类文件进行了多目标处理,但我也想在这里切换到使用模块。
我目前的理解是,这是提供一个module.map
文件的问题,该文件将列出我希望“导出”的类的头文件。
我必须执行哪些具体步骤?在MyProject
和MyProjectTests
两个目标中,我应该将头文件放置在哪里以及需要更改哪些构建设置?
我目前在我的项目中有一个(目前为空)module.map
,目标MyProject
的构建设置包括Defines Module: Yes
、Product Module Name: MyProject
。
更新我现在想知道是否不可能将 ios 应用程序(而不是 framework)项目中的 (Objective-C) 文件作为模块公开。但它似乎已经适用于 Swift 文件(不知何故)。
【问题讨论】:
【参考方案1】:我现在已经得出结论,当前的 Xcode (6.1.1) 工具无法做到这一点。 (真是浪费时间!)
将源文件双向定位到 MyProject
和 MyProjetTest
的旧方案也为具有大量代码的混合 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)类的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Swift 单元测试访问测试目标中存在的 Objective-C 代码?