延迟初始化听起来很棒。为什么不总是默认使用延迟初始化?

时间:2017-09-21 03:29:32

标签: swift initialization lazy-loading lazy-initialization

似乎懒惰的初始化很棒。我理解这个概念,并对我的代码进行了测试,但我没有看到任何滞后。那么问题是,为什么不总是使用延迟初始化?这有什么缺点?我不知道什么?

2 个答案:

答案 0 :(得分:4)

考虑lazy var

的这个例子
struct S {
    lazy var lazyVar: Int = { /* compute some value */ 0 }()
}

幕后真正发生的是这样的事情:

struct S {
    var _lazyVar: Int? = nil

    var lazyVar: Int {
        mutating get {
            if let existingValue = _lazyVar {
                return existingValue
            }
            else {
                let newlyComputedValue = /* compute some value */ 0
                _lazyVar = newlyComputedValue
                return newlyComputedValue
            }
        }
    }
}

如您所见,lazyVar的每次访问都需要一个分支,以检查是否已有值,或者是否有必要首次计算一个值。这增加了开销,这很容易超过通过简单(快速)推导来懒惰地评估值的好处。

答案 1 :(得分:3)

lazy的一个最大缺点是lazy变量不能是常量。这个缺点最终将消除许多必须将某些变量声明为let的情况。

就可读性而言,当其他开发人员阅读您的代码并看到lazy实现时,作为开发人员,我会立即知道此变量是运行密集型的,或者此变量需要来自其他源的某些值在此之前可以计算出来。