为什么我需要在Swift中为struct编写初始化程序才能在单元测试中使用它?

Evg*_*nii 17 xcode ios swift

我正在尝试使用公共结构

public struct Person {
  public let name: String
}
Run Code Online (Sandbox Code Playgroud)

在单元测试中(XCTest):

let person = Person(name: "Paul")
Run Code Online (Sandbox Code Playgroud)

测试构建失败,错误:

无法构造"Person",因为它没有可访问的初始值设定项.

为了构建测试,我需要为struct编写初始化器.感觉不对,因为结构已经有初始化器.有没有人有更好的解决方案?

Xcode版本6.1.1(6A2008a)

jrt*_*ton 43

问题是您使用结构获得的自动合成初始化程序被合成为internal,这意味着它无法从另一个模块访问.

您的单元测试当前在另一个模块中运行,因此无法看到初始化程序.正如Ben-G在他的回答中指出的那样,这个问题在Swift 2.0中得到了解决@testable.

这是Swift项目中单元测试普遍破坏的一部分.单元测试模块应具有对app模块的特殊访问权限,否则您必须添加大量的访问控制行李.

文档:

结构类型的默认成员初始值设定项

如果结构的任何存储属性是私有的,则结构类型的默认成员初始值设定项将被视为私有.否则,初始化程序具有内部访问级别.

与上面的默认初始化程序一样,如果希望在另一个模块中使用成员初始化程序时可以初始化公共结构类型,则必须自己提供公共成员初始化程序作为类型定义的一部分.

  • 也适用于在新6.3游乐场中添加到Sources目录的"支持代码".继续游乐场的主题不断羞于有用. (3认同)

Ben*_*n-G 15

这在Swift 2.0中使用@testable属性修复.

如果将模块导入到测试中,@testable合成的初始化器将对您的测试可见.

你可以在这里找到一个简短的介绍@testable .