【发布时间】:2017-05-24 09:05:58
【问题描述】:
我经历了多个关于堆栈溢出的问题,但我没有得到一个答案,可以定义什么是“LAZY”关键字以及我们为什么在 Swift 中使用它。我对 Swift 很陌生,请解释一下。
【问题讨论】:
-
非常感谢......我现在明白了。
-
很高兴听到它:)
我经历了多个关于堆栈溢出的问题,但我没有得到一个答案,可以定义什么是“LAZY”关键字以及我们为什么在 Swift 中使用它。我对 Swift 很陌生,请解释一下。
【问题讨论】:
这个词在两种情况下使用。
惰性变量是一种存储属性,计算一次但直到第一次被引用时才计算。如果我有这个:
var x: Int = someExpensiveFunction()
它是在实例化其拥有的对象时计算的。如果我这样做
lazy var x: Int = someExpensiveFunction()
直到我第一次使用x时才计算出来。
惰性序列是根据需要计算一些操作的序列。例如在这段代码中
[1, 2, 3].map { someExpensiveFunction($0) }
映射的序列立即被完全计算。但是在下面
[1, 2, 3].lazy.map { someExpensiveFunction($0) }
最终序列的每个连续元素仅在被请求时计算,例如通过迭代器。
我想,从技术上讲,在第二种情况下,lazy 没有被用作关键字,但为了完整起见,我将其包括在内。
【讨论】:
lazy 存储属性是一个属性,其初始值在第一次使用之前不会计算。您可以通过在声明之前写入惰性修饰符来指示 lazy 存储属性。
您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值。常量属性在初始化完成之前必须始终有一个值,因此不能声明为惰性。
结帐this 参考以获取更多信息。
所以基本上,您可以将lazy 视为对昂贵工作的即时计算。这些变量是使用您仅在首次请求该变量时指定的函数创建的。如果从未请求过,则该函数永远不会运行,因此它确实有助于节省处理时间。
【讨论】:
惰性属性的关键在于它们仅在第一次需要时才计算,然后保存它们的值。
它避免了复杂类的不必要初始化,因此它们只会在您访问它们时创建..
查看此链接以更好地理解它..
【讨论】: