为什么我需要在Swift中为struct编写初始化程序,以便在unit testing中使用它?

我正在尝试使用公共结构

public struct Person { public let name: String } 

在unit testing(XCTest)中:

 let person = Person(name: "Paul") 

testing版本失败,错误:

“人”不能被构造,因为它没有可访问的初始化器。

为了构buildtesting,我需要为结构编写一个初始化程序。 感觉不对,因为结构已经有了初始化器。 有没有人有更好的解决scheme?

Xcode版本6.1.1(6A2008a)

这是用@testable属性在Swift 2.0中@testable

如果您使用@testable将模块导入到testing中, @testable合成的初始值设定项对您的testing将变得可见。

你可以在这里find一个简短的介绍@testable

问题是你得到一个结构的自动合成的初始化程序是合成为internal ,这意味着它不能从另一个模块访问。

你的unit testing目前在另一个模块中运行,所以他们看不到初始化程序。 正如Ben-G在他的回答中指出的那样,这是从Swift 2.0的@testable属性开始的。

这是Swift项目中unit testing的一般性破坏的一部分。 unit testing模块应该具有对应用程序模块的特殊访问权限,否则您必须添加许多访问控制行李。

从文档 :

结构types的默认成员初始化器

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

与上面的默认初始值设定项一样, 如果要在另一个模块中使用成员初始值设定项来初始化公共结构types,则必须自己提供一个公共成员初始值设定项,作为types定义的一部分