斯威夫特的懒惰变种

Giz*_*odo 0 var lazy-loading let ios swift

在阅读了Swift的懒惰变量之后,我有以下问题:

class MainViewController: UIViewController {

      lazy var heavyClass = HeavyClass()

      func buttonPressed () {
         //Use heavyClass here
         self.heavyClass.doStuff()
      }    
}
Run Code Online (Sandbox Code Playgroud)

因此,您使用上面的lazy var来优化代码,以便不会立即分配heavyClass.因此,在启动时,这将是最佳的,因为在启动时不会分配heavyClass.

但是,这不会与上面相同吗?

class MainViewController: UIViewController {

      var heavyClass : HeavyClass?

      func buttonPressed () {
         //Use heavyClass here
         self.heavyClass =  HeavyClass()
         self.heavyClass!.doStuff()
      }    
}
Run Code Online (Sandbox Code Playgroud)

小智 6

在您的示例中,结果并不完全相同,具体如下:

  1. 单实例化.每次buttonPressed()调用时,HeavyClass都会实例化一个新的.使用lazy关键字时不是这种情况,该关键字仅在首次访问时创建实例.要匹配惰性语义,您必须heavyClass == nil在每次访问之前检查和设置是否.

  2. 空性.您必须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()
}
Run Code Online (Sandbox Code Playgroud)

这是使用惰性变量整理的:

func buttonPressed() {
    self.heavyClass.doStuff()
}

func aDifferentButtonPressed() {
    self.heavyClass.doSomethingElse()
}
Run Code Online (Sandbox Code Playgroud)