正确使用延迟实例化

时间:2017-01-19 10:12:53

标签: swift lazy-initialization

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

的情况下使用
  • 懒惰属性可能需要或可能不需要初始化和/或
  • 该属性的初始化可能很昂贵和/或
  • 属性的初始化取决于可能事先不知道的其他参数。

然而,越来越多的代码就像这样[伪代码]:

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

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

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

2 个答案:

答案 0 :(得分:3)

你是完全正确的。

在特定情况下,不需要进行惰性实例化。

您说的案件也是正确的。

但是,在这种情况下使用延迟实例化不应该产生任何巨大的不利影响。

但是,如果我认为我会将其更改为let并删除lazy。 (特别是如果它在任何时候都没有变异)。

答案 1 :(得分:1)

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

另一点:lazy实例属性不必是定义和调用匿名函数,在你给出的愚蠢示例中,没有任何理由可以这样做。这也可以做到:

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

lazy和define-and-call都很有用,并且通常很有用,但不要混淆它们。