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

2024-06-24

我正在尝试使用公共结构

public struct Person {
  public let name: String
}

在单元测试(XCTest)中:

let person = Person(name: "Paul")

测试构建失败并出现错误:

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

为了构建测试,我需要为结构编写一个初始化程序。感觉不对,因为结构已经有了初始化器。有人有更好的解决方案吗?

Xcode 版本 6.1.1 (6A2008a)


问题在于,使用结构获得的自动合成初始化程序被合成为internal,这意味着无法从其他模块访问它。

您的单元测试当前在另一个模块中运行,因此它们看不到初始化程序。正如 Ben-G 在他的回答中指出的那样,从 Swift 2.0 开始,这个问题已得到解决@testable属性。

这是 Swift 项目中单元测试普遍缺陷的一部分。单元测试模块应该对应用程序模块具有特殊访问权限,否则您必须添加大量访问控制包袱。

来自文档 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html:

结构类型的默认成员初始化器

如果结构体的任何存储属性是私有的,则结构类型的默认成员初始化器被视为私有。否则,初始化程序的访问级别为内部。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我需要在 Swift 中为结构编写初始化程序才能在单元测试中使用它? 的相关文章

随机推荐