ios - Swift 的惰性变量

标签 ios swift lazy-loading var let

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

最佳答案

在您的示例中,结果在以下方面并不完全相同:

  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()
}

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

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

func aDifferentButtonPressed() {
    self.heavyClass.doSomethingElse()
}

关于ios - Swift 的惰性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49440974/

相关文章:

c# - Entity Framework 中的延迟加载项目

ios - 如何使用 Facebook 获取用户的电子邮件?

ios - 无法在 Ad-Hoc 模式下编译 iOS-App (Xamarin.iOS)

ios - 关注者计数器未更新 firebase 中的节点

与 os_unfair_lock_lock 的快速访问竞争

java - JPA 延迟加载性能优势有多重要?

ios - 当我通过滚动弹起时,我想更改图像边界的大小和表格边界的大小

javascript - 如何从 IOS 中的 React-Native 应用程序打开外部应用程序?

ios - [Swift]加载运行时下载的 scn 文件时为 nil

java - spring mvc 4 + hibernate 5 懒加载配置