Ios 为什么我需要在Swift中为结构编写初始值设定项,以便在单元测试中使用它?
我正在尝试使用公共结构Ios 为什么我需要在Swift中为结构编写初始值设定项,以便在单元测试中使用它?,ios,xcode,swift,Ios,Xcode,Swift,我正在尝试使用公共结构 public struct Person { public let name: String } 在单元测试(XCTest)中: 测试生成失败,出现错误: 无法构造“Person”,因为它没有可访问的初始值设定项 为了构建测试,我需要为结构编写一个初始值设定项。感觉不正确,因为结构已具有初始值设定项。有谁有更好的解决方案吗 Xcode版本6.1.1(6A2008a)问题在于,使用结构得到的自动合成初始化器被合成为内部,这意味着不能从其他模块访问它 您的单元测试当前在
public struct Person {
public let name: String
}
在单元测试(XCTest)中:
测试生成失败,出现错误:
无法构造“Person”,因为它没有可访问的初始值设定项
为了构建测试,我需要为结构编写一个初始值设定项。感觉不正确,因为结构已具有初始值设定项。有谁有更好的解决方案吗
Xcode版本6.1.1(6A2008a)问题在于,使用结构得到的自动合成初始化器被合成为
内部
,这意味着不能从其他模块访问它
您的单元测试当前在另一个模块中运行,因此它们无法看到初始化器。正如Ben-G在他的回答中指出的那样,这是从Swift 2.0开始使用@testable
属性解决的
这是Swift项目中单元测试的一般中断的一部分。单元测试模块应具有对应用程序模块的特殊访问权限,否则您必须添加大量访问控制行李
从:
结构类型的默认成员初始值设定项
如果结构的任何存储属性都是私有的,则结构类型的默认成员初始值设定项将被视为私有的。否则,初始值设定项的访问级别为内部
与上面的默认初始值设定项一样,如果希望在另一个模块中使用公共结构类型时可以使用成员初始值设定项进行初始化,则必须自己提供公共成员初始值设定项,作为类型定义的一部分
这在Swift 2.0中通过
@testable
属性固定
如果使用@testable
将模块导入到测试中,则合成的初始值设定项将对测试可见
您可以找到
@testable
的简要介绍。我认为问题在于:由于“name”是一个常量,您必须为它初始化一个值。这也适用于在新的6.3版本中添加到Sources dir的“support code”。继续操场的主题就是不断地回避有用的东西。有趣的是,这与在操场中使用structs
的解决方案是一样的。很好的发现。
let person = Person(name: "Paul")