在阅读了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()
}

07-24 22:04