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

use*_*800 18 swift

以下是否有区别:

懒变量:

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

功能:

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

计算物业:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}
Run Code Online (Sandbox Code Playgroud)

什么方法最好用?

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

Swe*_*per 20

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


Mo *_*eed 10

第一个:

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

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

第二个:

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

是正常的函数声明,这只是声明.如果你想调用那个函数,你会这样做:profileImageIsLoaded().

第三个:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}
Run Code Online (Sandbox Code Playgroud)

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

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