在阅读了Swift的惰性变量之后,我有以下问题:
class MainViewController: UIViewController {
lazy var heavyClass = HeavyClass()
func buttonPressed () {
//Use heavyClass here
self.heavyClass.doStuff()
}
}
所以您可以使用上面的惰性变量来优化代码,这样就不会立即分配heavyClass。因此,在发射时,这将是最佳的,因为在发射时间上不会分配重轮。
然而,这难道不是和上面一样吗?
class MainViewController: UIViewController {
var heavyClass : HeavyClass?
func buttonPressed () {
//Use heavyClass here
self.heavyClass = HeavyClass()
self.heavyClass!.doStuff()
}
}
最佳答案
在您的示例中,结果在以下方面不完全相同:
单一实例化。每次调用buttonPressed()
时,都会实例化一个新的HeavyClass
。当使用lazy关键字时,情况并非如此,它只会在第一次访问时创建实例。要匹配惰性语义,必须在每次访问之前检查并设置ifheavyClass == 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()
}