【发布时间】:2017-01-19 10:12:53
【问题描述】:
我对惰性实例化的理解是应该在以下情况下使用它
- 惰性属性可能需要也可能不需要初始化和/或
- 属性的初始化可能很昂贵和/或
- 属性的初始化取决于其他可能事先不知道的参数。
然而,我越来越多地遇到这样的代码 [伪代码]:
class SomeClass {
lazy var itemSize: CGSize = { return CGSize(width: 80, height: 80) }()
....
init() {
[use itemSize for some init work]
}
}
对我来说,这没有任何意义,因为 itemSize 总是需要被初始化,并不昂贵并且不依赖于任何未知属性。我错过了什么吗?
【问题讨论】:
-
我认为这也很好,因为它允许您在小的懒惰代码块中设置任何内容,而不是一些拥有大量 viewDidLoad 的人:充满了配置其属性的不同方面。跨度>
-
@SeanLintern88 该代码块与其懒惰无关。任何属性都可以用这样的块来实例化。我经常使用...
let blah: UILabel = {...}()来设置其他类需要访问的属性。它甚至可以在函数内部使用来创建变量等......不仅仅是属性。 -
另一个相关见解:
lazy实例属性可能不是不可变的。然而,所有 type 属性(static .../class ...)默认为lazy,您可以自然地实现不可变类型属性。于是就有了lazy不可变属性,即不可变类型属性。