Xcode 8 宏 NSLocalizedString 的扩展不明确

Xcode 8 Ambiguous expansion of macro NSLocalizedString

我的单元测试 .pch 文件中包含以下内容,以允许我的单元测试为本地化文件找到正确的包,并且在我升级到 Xcode8.

之前它工作正常
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"Tests-Unit"] localizedStringForKey:(key) value:@"" table:nil]

现在,我收到警告

Ambiguous expansion of macro NSLocalizedString 

这可以解释为什么我的单元测试失败了,因为它们再也找不到本地化的字符串值了。

知道哪里出了问题吗?我现在需要做些不同的事情吗?

编辑: 我有一种感觉,这与我所有的源文件都在 2 个目标 中有关,即一个用于项目,一个用于单元测试,这是我们设置它的方式。我正在尝试清理它并从单元测试目标中删除我的所有源文件并添加

@testable import ProjectName

而不是单元测试文件,以便能够访问我的代码进行测试,但我现在

File 'MyFile.swift' is part of module 'ProjectName'; ignoring import.

在您的项目构建设置中,将 -Wno-ambiguous-macro 添加到 Other C Flags

它解决了问题(警告消失),但不确定副作用是什么。

我终于恢复正常了。

假设我们的项目名为 Panda,它由 Obj-C 和 Swift 文件组成。所有这些文件都在我们的 PandaPandaTests 目标中。

第 1 步: 确保所有文件都具有正确的目标成员资格,即 Panda 目标:仅源文件、开发框架、图像等和 PandaTests 目标:仅测试文件、测试框架、模拟数据等

第 2 步:确保您的 Panda 项目的 Build Settings -> Enable Testability 设置为 Yes.

第 3 步:确保您的 PandaTests 项目的 Build Settings -> Product Module Name 设置为 PandaTests.

第 4 步: 按住 Option 按钮,然后单击 Product,做一个很好的清洁。您应该会看到 Clean Build Folder 选项。

第 5 步: 对于 Swift 单元测试,添加 @testable import Panda。由于我们现在已经从 PandaTests 目标中删除了所有源代码文件,因此单元测试需要一种访问项目文件的方法。这使我们的 Swift 单元测试能够访问我们所有的 Swift 文件和那些包含在我们的 Panda-Bridging-Header.h[=42= 中的 Obj-C 文件].