Swift中懒惰变量的优点是什么?

时间:2016-11-19 15:37:40

标签: swift

初始化的优点或区别是什么:

lazy var hintView: HintView = {
        let hintView = HintView()
        return hintView
}()

而不是简单地使用:

var hintView = HintView()

HintView是:class HintView: UIView {}

非常感谢帮助。

5 个答案:

答案 0 :(得分:53)

让我们实际做。见截图

enter image description here

我刚刚在viewDidLoad停止了调试器。您可以看到secondHintView有一个内存,因为不是懒惰的存储空间,但hintView仍然是 nil ,因为它是懒惰一个。一旦使用/访问惰性变量,就会分配内存。

懒惰也应该是var。

答案 1 :(得分:18)

懒惰存储的属性与存储的属性

懒惰属性比存储属性有一些优点。

  1. 只有在读取该属性时才会执行与惰性属性关联的闭包。因此,如果由于某种原因未使用该属性(可能是因为用户的某些决定),则可以避免不必要的分配和计算。
  2. 您可以使用存储属性的值填充惰性属性。
  3. 您可以在懒惰属性的封闭内使用self

答案 2 :(得分:3)

延迟存储属性仅在第一次访问时计算。

它是var而不是let,因为在初始化过程中未初始化该值。它将在稍后计算。这就是为什么懒惰存储的属性必须是variable而不是constant

lazy var hintView: HintView = {
        let hintView = HintView()
        return hintView
}()

let h = hintView

在上面的代码中,无论何时首次访问hintView,都会执行分配给它的closure,并返回值并存储在h中。

有关详细信息,请参阅:

Swift lazy stored property versus regular stored property when using closure

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

答案 3 :(得分:0)

在某些情况下,使用lazy vars可能会更快,因为它们只会在您第一次访问时计算一次。

答案 4 :(得分:0)

将变量的内容/计算结果放在单独的函数中以提高可读性也是一个好习惯,例如:

// MARK: Public views
lazy var titleView = getTitleView()
lazy var hintView = getHintView(.red)
lazy var secondHintView = getHintView(.blue)
lazy var thirdHintView = getHintView(.yellow)
lazy var fourthHintView = getHintView(.brown)

// MARK: Private functions
private func getTitleView() -> TitleView {
   let view = TitleView()
   return view
}

private func getHintView(_ textColor: UIColor) -> HintView {
   let view = HintView()
   view.textColor = textColor
   return view
}

这样,您就可以重用某些功能,不必编写更少的代码,并且所有变量的可读性都更高。例如。我有5个独立的变量,但我一眼就能看到它们。