通常,许多敏捷开发人员都通过执行lambda来初始化惰性变量。但是我不明白为什么当一行计算时他们会使用lambda。以下代码示例之间有什么区别?
var x = 7
var y = 9
lazy var z = x * y
var x = 7
var y = 9
lazy var z: Int = {
return x * y
}()
我是新手,从天真的观点来看,差异看起来像这样:
x * y
但用惰性方式初始化值对吗?
这个问题不是重复的 What is the advantage of closure stored property Initialisation?,因为它与延迟计算有关。
答案 0 :(得分:2)
第二种方法的人犯了一个错误,仅此而已。
这个错误很容易犯。有时(1)需要定义和调用初始化程序,即当您需要多个代码语句来获取变量的初始值时:
let timed : Bool = {
if val == 1 {
return true
} else {
return false
}
}()
有时候(2),您需要进行延迟初始化,即为了在属性初始化期间提及self
:
lazy var arrow : UIImage = self.arrowImage()
有时候(3),您需要同时做这两项事情:
lazy var prog : UIProgressView = {
let p = UIProgressView(progressViewStyle: .default)
p.alpha = 0.7
p.trackTintColor = UIColor.clear
p.progressTintColor = UIColor.black
p.frame = CGRect(x:0, y:0, width:self.view.bounds.size.width, height:20)
p.progress = 1.0
return p
}()
因此,出于习惯,误解或谨慎的考虑,自然而然地诉诸表格3,而实际上只有一行,而您所需的只是表格2。这是一个容易犯的错误,并且没有危害。