什么时候不需要通过lambda执行初始化惰性变量?

时间:2019-03-16 06:56:55

标签: swift

通常,许多敏捷开发人员都通过执行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?,因为它与延迟计算有关。

1 个答案:

答案 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。这是一个容易犯的错误,并且没有危害。