【发布时间】:2017-05-05 21:34:24
【问题描述】:
当我不使用 getter 或 setter 时,我想知道惰性关键字的含义。看这段代码:
class ViewController: UIViewController
{
lazy var toto = 5
}
编译器接受惰性关键字,但我不知道为什么。懒惰意味着我只会在阅读时计算该值。但是对于整数值不需要计算任何东西。
【问题讨论】:
标签: swift
当我不使用 getter 或 setter 时,我想知道惰性关键字的含义。看这段代码:
class ViewController: UIViewController
{
lazy var toto = 5
}
编译器接受惰性关键字,但我不知道为什么。懒惰意味着我只会在阅读时计算该值。但是对于整数值不需要计算任何东西。
【问题讨论】:
标签: swift
lazy 表示 stored property 的初始值在第一次访问时被评估和分配(所以这实际上与 getter 无关
或与 computed 属性一起使用的 setter)。
lazy var toto = ... some expression evaluating to an `Int` ...
定义一个惰性Int 属性。
lazy可以用来延迟初始值的求值
直到需要该属性,例如如果该评估是
“昂贵”或有副作用。
但是从语言/编译器的角度来看,右边的初始值 可以是任意表达式。 它是常量还是涉及函数调用的“复杂”表达式都没有关系。
lazy var a = 5 // A constant
lazy var b = someFunctionReturningAnInt() // Function call
lazy var c = { _ -> Int in
return 42
}() // Immediately evaluated closure
都是有效的定义。使用带有常量初始值的lazy 没有任何优势,但它是有效的 Swift。
【讨论】:
你应该只使用惰性来初始化一个新的类变量。 official Swift guide 给出了一个很好的例子,总结如下:
class DataImporter {
init() {
//importing data, non-trivial task
}
}
class DataManager {
lazy var dataImporter = DataImporter()
init() {
//here, dataImporter is not yet created because it is lazy to move its ass~
}
let manager = DataManager() // manager.dataImporter is NOT created yet
manager.dataImporter //ONLY now it is created
【讨论】: