延迟实例化的正确使用

Correct use of lazy instantiation

我对惰性实例化的理解是它应该在

的情况下使用

然而,我越来越多地遇到这样的代码[伪代码]:

class SomeClass {
    lazy var itemSize: CGSize = { return CGSize(width: 80, height: 80) }()

    ....
    init() {
        [use itemSize for some init work]
    }
}

对我来说,这没有意义,因为 itemSize 总是需要初始化,并不昂贵并且不依赖于任何未知 属性。我错过了什么吗?

你完全正确。

在那种特殊情况下,不需要惰性实例化。

你说的情况也是正确的。

但是,在这种情况下使用惰性实例化不会产生任何巨大的不利影响。

但是,如果我看到那样的话,我会把它改成 let 并删除 lazy。 (特别是如果它在任何时候都没有被突变)。

实际上,您已经省略(或省略到第三个要点中)lazy 实例属性的最常见原因:它们可以显式或隐式地引用 self,而普通实例属性不能。

另一点:lazy 实例属性不必是 define-and-call 匿名函数,在您给出的愚蠢示例中,没有任何理由如此。这也可以做到:

lazy var itemSize: CGSize = CGSize(width: 80, height: 80) 

lazy和define-and-call都有用,而且经常一起用,但不要混淆。