【问题标题】:Lazy stored property in SwiftSwift 中的惰性存储属性
【发布时间】:2017-10-29 14:38:43
【问题描述】:

我对惰性存储属性有些困惑。 我阅读了很多教程并发现了这一点,但在实际场景中我无法理解。 有人可以请清除一些东西,

  1. 惰性存储属性是在第一次使用时才计算初始值的属性...

  2. 您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值...

  3. 当属性的初始值依赖于外部因素时,延迟属性非常有用,而外部因素的值在实例初始化完成后才知道。

  4. 我们应该在哪里使用惰性存储属性

谢谢

【问题讨论】:

  • 惰性存储属性遇到的问题是什么?这些陈述的含义非常明确。

标签: swift lazy-evaluation


【解决方案1】:

Mike Buss 写了一篇关于 Swift 中延迟初始化的文章http://mikebuss.com/2014/06/22/lazy-initialization-swift/

何时使用延迟初始化的一个例子是当在对象初始化之后才知道属性的初始值或当属性的计算成本很高时强>。

以下是帖子中两种情况的两个示例:

在第一个示例中,我们不知道个性化问候应该具有哪个值。我们需要等到对象初始化后才能知道这个人的正确问候语。

class Person {

var name: String

lazy var personalizedGreeting: String = {
    [unowned self] in
    return "Hello, \(self.name)!"
    }()

init(name: String) {
        self.name = name
    }
}

第二个示例涵盖了昂贵计算的情况。想象一个 MathHelper 类,它应该为您提供 pi 和其他重要常量的值。如果只使用其中的一个子集,则不需要计算所有常量。

class MathHelper {

lazy var pi: Double = {
    // Calculate pi to a crazy number of digits
    return resultOfCalculation
    }()

}

【讨论】:

  • 如果我更改名称,如何更改个性化问候语??在相同的代码中..
  • 您可能想看看这个question。您有多种方法可以触发惰性属性的重新初始化。
【解决方案2】:

解释清楚!!我想添加一个简单的例子来更好地理解它。

惰性属性是一种存储属性,只有在实际使用变量时才会分配内存。

class Car{
    lazy var brand: String = "BMW" // Memory not allocated
}

let aCar = Car()
print(aCar.brand) // Memory allocated as it is getting used here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2015-03-18
    • 1970-01-01
    • 2017-11-04
    • 2015-05-15
    • 2014-12-28
    • 2017-05-19
    • 2013-08-30
    相关资源
    最近更新 更多