swift中的静态属性被懒惰地初始化。我想使用类的静态属性作为依赖,我可以在进行单元测试时轻松替换它。该属性的值立即被调用了闭包,但是如果我在没有读取它的情况下替换该属性,我希望这个闭包永远不会执行。
但是在设置静态属性时,会执行原始闭包。惰性实例属性不是这种情况。那是为什么?
为了说明这个问题,我提供了一个示例代码。
此代码的输出:
class Foo {
static var bar1: String = {
print("here we are")
return "This is static bar"
}()
lazy var bar2: String = {
print("here we are too")
return "This is instance bar"
}()
}
let foo = Foo()
print("We have a Foo instance")
Foo.bar1 = "Overwritten bar 1"
print(Foo.bar1)
foo.bar2 = "Overwritten bar 2"
print(foo.bar2)
是:
We have a Foo instance
here we are
Overwritten bar 1
Overwritten bar 2
答案 0 :(得分:1)
但是在设置静态属性时,会执行原始闭包。惰性实例属性不是这种情况。那是为什么?
什么答案会让你满意?你是否要求某人阅读Apple的想法?你有能力像其他人一样阅读Swift源代码,所以去阅读它,看看它做了什么。就个人而言,我同意你的期望。在我看来,这种行为是一个错误,我已经向Apple提交了一份错误报告。如果您同意,也请提交一份。但如果我是你,我不希望有任何改变。而且无论如何,您的问题只能吸引意见,这不适合Stack Overflow。
如果您感到好奇,我的错误报告编号为19085421,部分内容为:
摘要:如果是,则根本不应评估lazy var的初始值设定项 将var写入而不先读取。但那是一个什么样的 全局变量。
重现步骤:运行随附的项目。
预期结果:我在任何人之前分配给全局变量 读取它的价值。因此我希望它的初始化程序永远不会 被评估。
实际结果:其初始化程序已评估,因为已登录 控制台证明。这在某种程度上打败了懒惰的目的。