ios - Objective-C 单元测试中的 Swift 类 - 生成的不完整 "-Swift.h"

标签 ios xcode swift xcode7 xctest

我正在将 Objective-C 应用程序转换为 Swift,并使用现有的 Objective-C 单元测试来确认更改是否正常工作。

我用 Swift 替换了几个 Objective-C 应用程序文件并执行了以下操作:

  • 在需要的地方添加了“@objc 类”(除了继承 Objective-C 类),
  • 将 Swift 文件定位到 MyApp 和 MyAppTest 目标,
  • 为两个目标设置“Enable Testability Yes”(仅调试)。
  • 在单元测试文件中,我添加了#import "MyAppTests-Swift.h"并删除了#import "MyObjcClass.h"。
  • 我还从构建阶段编译源列表中删除了“MyObjcClass.m”。

Xcode 生成“MyAppTests-Swift.h”文件。检查生成的文件(cmd-click),揭示了通常大量的 Swift 特定的#if#defines,它们位于我的 Swift 类应该位于但实际上没有的位置之前。

该应用程序将使用替换 Swift 文件构建并正常运行。应用程序中还有其他 Objective-C 文件导入“MyApp-Swift.h 以便使用我的 Swift 类。” MyApp-Swift.h"文件包含通常大量的 Swift 特定 #if#defines 和来自 Swift 应用程序文件的我的 Swift 类。

Xcode 为两个目标生成“-Swift.h”文件。然而,出于某种原因,用于测试目标的那一个没有收到 Swift 类信息,而用于应用目标的那一个收到了。因此,使用特定于 Swift 而不是 Objective-C 的功能不是问题。

我已经消除了所有编译错误,从干净但仍然无法工作。

有什么建议吗?

我正在使用 XC7 (7C68) iOS 9.1

最佳答案

终于成功了。

我注意到在设置应用程序目标时未设置单元测试目标的 Objective-C 桥接 header 路径。 (Swift 编译器 - 代码生成build设置)XC 将为应用程序目标设置此路径(可能在它询问您是否要创建桥接头文件时)但是,它不会设置单元测试目标的路径。我想它假设单元测试不需要访问桥接头。

我之前并不关心这个,因为 Objective-C Bridging Header 用于将 Obj-C 代码导入 Swift 文件。我的 Swift 代码没有使用任何 Obj-C 类,所以桥接头文件中没有任何内容,所以我认为单元测试目标不需要它,并将单元测试目标的路径设置保留为默认空白。

原来我错了。

幸运的是,我将此路径设置为指向应用程序目录中的桥接 header (即使该文件未导入任何 obj-c 类)。我重新运行单元测试,现在自动生成的“MyAppTests-Swift.h”文件包含 obj-c 单元测试引用的 Swift 类。

看起来有点古怪。 Xcode 需要一个未使用文件(桥接 header )的路径,以便在自动生成的“-Swift.h”文件中添加引用的 swift 类。

关于ios - Objective-C 单元测试中的 Swift 类 - 生成的不完整 "-Swift.h",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34342814/

相关文章:

ios - 如何将 UISearchBar 文本字段默认占位符 "Search"更改为 "Enter city name..."

iOS - MPMediaItem 显示默认图稿

ios - 无法将第三方框架导入cocoapod

iphone - 将 NSstring 日期转换为 UTC 日期

ios - xCode 4.3.2 - 构建分析,如何运行该应用程序?

ios - swift : scroll the view up when keyboard shows

ios - 如果在 Xcode 中不小心删除了对文件的引用怎么办?

ios - UITabBar 项目在 iOS 12.1 上跳回后退导航

swift - Spritekit 动画不工作

ios - NSAttributedString 和 iPhone 部署目标