在阅读了 Swift 的 lazy 变量之后,我有以下问题:
class MainViewController: UIViewController {
lazy var heavyClass = HeavyClass()
func buttonPressed () {
//Use heavyClass here
self.heavyClass.doStuff()
}
}
所以你使用上面的惰性变量来优化代码,所以 heavyClass 不会立即分配。因此,在启动时,这将是最佳选择,因为 heavyClass 不会在启动时分配。
但是,这不是和上面一样吗?
class MainViewController: UIViewController {
var heavyClass : HeavyClass?
func buttonPressed () {
//Use heavyClass here
self.heavyClass = HeavyClass()
self.heavyClass!.doStuff()
}
}
最佳答案
在您的示例中,结果在以下方面并不完全相同:
单一实例化。每次调用
buttonPressed()
时,都会实例化一个新的HeavyClass
。使用 lazy 关键字时情况并非如此,它只会在第一次访问时创建实例。为了匹配惰性语义,您必须在每次访问之前检查并设置heavyClass == nil
。可空性。每次要使用
heavyClass
时都必须解包,通过可选链接(heavyClass?.doStuff()
)或强制解包(heavyClass!.doStuff ()
)。您还可以将变量设置回nil
,这在第一个示例中将是编译器错误。
惰性变量的真正优势是当您有多个地方使用该变量时。我相信您可以在这里发现重复:
func buttonPressed() {
if self.heavyClass == nil {
self.heavyClass = HeavyClass()
}
self.heavyClass?.doStuff()
}
func aDifferentButtonPressed() {
if self.heavyClass == nil {
self.heavyClass = HeavyClass()
}
self.heavyClass?.doSomethingElse()
}
这是使用惰性变量整理的:
func buttonPressed() {
self.heavyClass.doStuff()
}
func aDifferentButtonPressed() {
self.heavyClass.doSomethingElse()
}
关于ios - Swift 的惰性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49440974/