Swift 为什么是静态属性';在执行任务时执行的关闭?

Swift 为什么是静态属性';在执行任务时执行的关闭?,swift,Swift,swift中的静态属性是惰性初始化的。我想使用类的静态属性作为依赖项,在进行单元测试时可以轻松替换。闭包立即调用了属性的值,但是如果我在没有读取属性的情况下替换属性,我希望这个闭包永远不会执行 但是,在设置静态属性时,将执行原始闭包。惰性实例属性的情况并非如此。为什么呢 为了说明这个问题,我提供了一个示例代码 此代码的输出: class Foo { static var bar1: String = { print("here we are") retur

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)
是:

但是,在设置静态属性时,将执行原始闭包。惰性实例属性的情况并非如此。为什么呢

什么答案能让你满意?你是在要求有人了解苹果的想法吗?你和其他人一样能够阅读Swift源代码,所以去阅读它,看看它能做什么。就个人而言,我同意你的期望。在我看来,这种行为是一个缺陷,我已经向苹果公司提交了一份缺陷报告。如果你同意,也提交一份。但如果我是你,我不会期望任何改变。无论如何,您的问题只能诉诸于意见,这不适合堆栈溢出

如果您感到好奇,我的bug报告编号为19085421,部分内容如下:

摘要:如果 将变量写入,而不首先读取。但这是一个很好的例子 全球风险价值确实如此

复制步骤:运行封闭的项目

预期结果:我在任何人之前分配给全局var 读取其值。因此,我希望它的初始值设定项永远不会 进行评估

实际结果:在 事实证明。这在某种程度上违背了懒惰的目的


我更新了代码,以说明它不会发生在实例初始化时。这也可以通过在闭包中放置断点并查看堆栈跟踪来确认。嘿,谢谢你提供的bug报告信息!我不确定这是否是一个bug,我只是觉得我没有得到什么东西,这是一个很好的理由为什么它会这样发生。
We have a Foo instance
here we are
Overwritten bar 1
Overwritten bar 2