Boo*_*oon 5 lazy-evaluation swift
在本文中,它说(引用下面的代码):"你必须使用lazy来防止关闭被多次创建."
private lazy var variable:SomeClass = {
let fVariable = SomeClass()
fVariable.value = 10
return fVariable
}()
Run Code Online (Sandbox Code Playgroud)
为什么懒惰会阻止封闭被多次创建?为什么缺乏懒惰导致它不止一次评估?
mat*_*att 14
你引用的教程代码是这样的:
private lazy var variable:SomeClass = {
let fVariable = SomeClass()
fVariable.value = 10
return fVariable
}()
Run Code Online (Sandbox Code Playgroud)
与此形成对比:
private var variable:SomeClass {
let fVariable = SomeClass()
fVariable.value = 10
return fVariable
}
Run Code Online (Sandbox Code Playgroud)
第一个初始化variable为新创建的SomeClass实例,最多一次(甚至可能不是那么多次).第二个是只读计算变量,每次读取其值时都会创建一个新的SomeClass实例.
Jac*_*nce 11
你的直觉是正确的,那篇文章是不正确的.我猜测作者正在将计算属性语法与立即执行的闭包技巧混淆/混淆.该lazy关键字无关的封闭的执行多少次.lazy只是使属性在第一次访问之前保持未初始化,此时评估等号右侧的表达式.
为了简化,这个:
var myVar: MyType {
return MyType()
}
Run Code Online (Sandbox Code Playgroud)
与此截然不同:
var myVar: MyType = MyType()
Run Code Online (Sandbox Code Playgroud)
它在存储方面类似,但具有与此不同的初始化语义:
lazy var myVar: MyType = MyType()
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,myVar是一个计算属性,每次myVar访问时都会执行花括号内的代码.换句话说,每次访问myVar时都会得到一个新创建的对象.
在第二个示例中,myVar是存储属性,并且在包含该属性的类或结构的初始化期间,对等号后面的表达式求值一次.
在第三个示例中,myVar仍然是一个存储属性,但是等号后面的表达式的评估(无论是初始化表达式,函数调用还是闭包调用)会被延迟,直到被访问为止.
作为旁注,这行代码:
lazy var myVar: MyType = { ... }()
Run Code Online (Sandbox Code Playgroud)
相当于:
func doStuffAndReturnMyType() { ... }
lazy var myVar: MyType = doStuffAndReturnMyType()
Run Code Online (Sandbox Code Playgroud)
第一个例子中的简写并不是专门设计的 - 它只是起作用,因为Swift的类型系统(很棒)并将闭包视为未命名(匿名)函数.
| 归档时间: |
|
| 查看次数: |
2537 次 |
| 最近记录: |