似乎懒惰的初始化很棒。我理解这个概念,并对我的代码进行了测试,但我没有看到任何滞后。那么问题是,为什么不总是使用延迟初始化?这有什么缺点?我不知道什么?
答案 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
实现时,作为开发人员,我会立即知道此变量是运行密集型的,或者此变量需要来自其他源的某些值在此之前可以计算出来。