为什么在赋值时执行静态属性的闭包?

时间:2016-08-02 04:33:12

标签: swift

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

1 个答案:

答案 0 :(得分:1)

  

但是在设置静态属性时,会执行原始闭包。惰性实例属性不是这种情况。那是为什么?

什么答案会让你满意?你是否要求某人阅读Apple的想法?你有能力像其他人一样阅读Swift源代码,所以去阅读它,看看它做了什么。就个人而言,我同意你的期望。在我看来,这种行为是一个错误,我已经向Apple提交了一份错误报告。如果您同意,也请提交一份。但如果我是你,我不希望有任何改变。而且无论如何,您的问题只能吸引意见,这不适合Stack Overflow。

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

  

摘要:如果是,则根本不应评估lazy var的初始值设定项   将var写入而不先读取。但那是一个什么样的   全局变量。

     

重现步骤:运行随附的项目。

     

预期结果:我在任何人之前分配给全局变量   读取它的价值。因此我希望它的初始化程序永远不会   被评估。

     

实际结果:其初始化程序评估,因为已登录   控制台证明。这在某种程度上打败了懒惰的目的。