延迟实例化的正确使用
Correct use of lazy instantiation
我对惰性实例化的理解是它应该在
的情况下使用
- 惰性属性可能需要也可能不需要初始化and/or
- 属性 的初始化可能很昂贵 and/or
- 属性 的初始化取决于其他可能事先不知道的参数。
然而,我越来越多地遇到这样的代码[伪代码]:
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都有用,而且经常一起用,但不要混淆。
我对惰性实例化的理解是它应该在
的情况下使用- 惰性属性可能需要也可能不需要初始化and/or
- 属性 的初始化可能很昂贵 and/or
- 属性 的初始化取决于其他可能事先不知道的参数。
然而,我越来越多地遇到这样的代码[伪代码]:
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都有用,而且经常一起用,但不要混淆。