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
是一个计算属性,每次访问此属性时,都会计算并返回它
选择使用哪一个始终取决于您的情况。
s实际上是存储的属性,因此您不能将其放入扩展中,或者任何不允许存储属性的地方lazy var
- 每次引用该属性时,都会运行计算属性的getter。这可能非常重要,尤其是当getter非常耗时或对代码的其他部分有副作用时
s的getter仅在第一次引用属性时运行,不再运行lazy var
s是变量。你可以变异它们lazy var
- 计算属性可以选择具有setter,因此有时它们是只读的
- 使用这样的函数与只读计算属性非常相似。您只需在获取其值时添加
()
nil
。@t-meyer:如果您只想在变量的整个生命周期中初始化变量一次,则可以使用lazy var。假设您想要设置NSFetchedResultsController,您想要在ViewController的整个生命周期中只初始化一次,在这种情况下,您可以使用lazy-var。如果您不使用lazy-var,您将使用If-condition检查变量是否每个都已初始化,或者是否与我们在objective C中使用的一样。lazy-var是干净和简单的解决方法。关于lazy-variables,需要注意的另一件重要事情是,它们不是线程安全的。如果两个线程试图同时访问惰性变量,则可能导致该变量被计算两次。@Sweeper:+1获取正确信息。我仍然怀疑哪一个在编译方面更有效?非常好的解释我很高兴它帮助了你!