Swift函数vs lazy var vs计算属性 - 差异?

时间:2018-01-01 13:27:46

标签: swift

以下是否存在差异:

懒惰变量:

lazy var profileImageIsLoaded : Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

功能:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

计算财产:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

哪种方法最好用?

我会多次调用函数/变量,所以我的问题也是懒惰的变量是否已更新"或者他们是否只获得一次价值。

2 个答案:

答案 0 :(得分:15)

  • lazy var实际上是存储的属性,因此您无法将其放入扩展程序或不允许存储属性的任何位置。
  • 每次引用该属性时,都会运行计算属性的getter。这可能很重要,特别是如果吸气剂耗时或对代码的其他部分有副作用。
  • lazy var的getter仅在首次引用该属性时运行,并且永远不会再次运行。
  • lazy var变量。你可以改变它们。
  • 计算属性可选有一个setter,因此有时它们是只读的。
  • 使用这样的函数非常类似于只读计算属性。您只需在获取其值时添加()

答案 1 :(得分:9)

第一个:

lazy var profileImageIsLoaded : Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

profileImageIsLoaded是一个存储属性,使用闭包进行懒惰初始化,一旦初始化变量,就不再调用此闭包,并且将返回第一次调用闭包时所采用的值。 / p>

第二个:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

是正常的函数声明,这只是声明。如果您想调用该功能,您可以这样做:profileImageIsLoaded()

第三个:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

profileImageIsLoaded是一个计算属性,每次访问此属性时,都会计算并返回它。

选择使用哪一个总取决于您的情况。