【问题标题】:When isn't necessary to initialize lazy variable with lambda execution?什么时候不需要使用 lambda 执行初始化惰性变量?
【发布时间】:2019-08-07 05:18:03
【问题描述】:

通常,许多 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 
}()

我是 swift 新手,从幼稚的角度来看,区别如下:

  • 第一个示例立即计算x * y通过惰性方式初始化值
  • 第二个样本计算以惰性方式初始化。

对吗?


这个问题不是重复的 What is the advantage of closure stored property Initialisation? 因为它是关于惰性计算的。

【问题讨论】:

  • 风格选择?我的意思是你也可以在普通属性上使用 lambda。
  • 显然是自定义。建议重复的原因是一样的
  • 当我在谷歌上搜索“lazy in swift”时,我发现{ ... }() 没有对象自定义是顶部链接和许多其他描述中的常见情况。现在我明白了没有区别。但是只有与 cmets 相结合的重复问题的链接(我以前无法谷歌)解释了我的区别。但是好的,我投票结束了问题。

标签: swift


【解决方案1】:

采用第二种方式的人是在犯错误,仅此而已。

这个错误很容易。有时(1)需要一个define-and-call初始化器,即当您需要多个代码语句来获取变量的初始值时:

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。这是一个简单的错误,并没有什么害处。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2016-12-10
  • 2012-02-01
  • 1970-01-01
  • 2017-04-10
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多