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

Swift函数vs lazy var vs计算属性-差异?,swift,Swift,以下各项之间是否存在差异: 惰性变量: lazy var profileImageIsLoaded : Bool = { return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0) }() 功能: func profileImageIsLoaded() -> Bool { return (profileImageView.image != nil) &a

以下各项之间是否存在差异:

惰性变量:

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)
}
什么样的方法是最好的

我会多次调用该函数/变量,因此我的问题还在于惰性变量是“更新”了还是只得到一个值。

第一个:

lazy var profileImageIsLoaded: Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()
profileImageIsLoaded
是一个使用闭包惰性初始化的存储属性,一旦变量初始化,将不再调用此闭包,并且将返回第一次调用闭包时的值

第二条:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}
是一个正常的函数声明,这只是一个声明。如果要调用该函数,可以这样做:
profileImageIsLoaded()

第三条:

var profileImageIsLoaded: Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}
profileImageIsLoaded
是一个计算属性,每次访问此属性时,都会计算并返回它

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

  • lazy var
    s实际上是存储的属性,因此您不能将其放入扩展中,或者任何不允许存储属性的地方
  • 每次引用该属性时,都会运行计算属性的getter。这可能非常重要,尤其是当getter非常耗时或对代码的其他部分有副作用时
  • lazy var
    s的getter仅在第一次引用属性时运行,不再运行
  • lazy var
    s是变量。你可以变异它们
  • 计算属性可以选择具有setter,因此有时它们是只读的
  • 使用这样的函数与只读计算属性非常相似。您只需在获取其值时添加
    ()

首次访问值时,仅分配一次惰性变量。每次访问计算变量时,都会计算它们。函数是计算变量的一个更复杂的版本,您可以传递参数,分配给本地属性,等等。是否存在可选的惰性变量,它们会做什么,或者这是一个完整的其他主题?@T.Meyer它们只是惰性变量,除了它们是可选类型之外。不同之处在于,您可以在闭包中返回
nil
。@t-meyer:如果您只想在变量的整个生命周期中初始化变量一次,则可以使用lazy var。假设您想要设置NSFetchedResultsController,您想要在ViewController的整个生命周期中只初始化一次,在这种情况下,您可以使用lazy-var。如果您不使用lazy-var,您将使用If-condition检查变量是否每个都已初始化,或者是否与我们在objective C中使用的一样。lazy-var是干净和简单的解决方法。关于lazy-variables,需要注意的另一件重要事情是,它们不是线程安全的。如果两个线程试图同时访问惰性变量,则可能导致该变量被计算两次。@Sweeper:+1获取正确信息。我仍然怀疑哪一个在编译方面更有效?非常好的解释我很高兴它帮助了你!