我们在第一次访问某个属性时,判断这个属性背后的存储是否已经存在,如果存在则直接返回,如果不存在则说明是首次访问,那么就进行初始化并存储后再返回。这样我们可以把这个属性的初始化时刻推迟,与包含它的对象的初始化时刻分开,以达到提升性能的目的。
对于一个属性是由复杂计算得到值得话,我们可以声明一个lazy
属性的方法。
class ClassLazy {
lazy var str: String = {
let str = "Hello"
print("只在首次访问输出")
return str
}()
}
如果只是一个简单的赋值,我们直接声明一个属性即可。
lazy var str1 = "Hello Str1"
另外,lazy
也可以用在集合中。
如下我们有两个迭代。
let data = 1...3
let dataResult = data.map { (i: Int) -> Int in
print("正在处理\(i)")
return i * 2
}
print("准备访问结果")
for i in dataResult {
print("操作后结果为\(i)")
}
print("操作完毕")
输出结果:
正在处理1
正在处理2
正在处理3
准备访问结果
操作后结果为2
操作后结果为4
操作后结果为6
操作完毕
如果循环不需要完全执行,可能存在提前退出的话,我们可以在map
的前面加一个lazy
修饰来进行性能优化效果会非常明显:
let data = 1...3
let dataResult = data.lazy.map { (i: Int) -> Int in
print("正在处理\(i)")
return i * 2
}
print("准备访问结果")
for i in dataResult {
print("操作后结果为\(i)")
}
print("操作完毕")
输出结果:
准备访问结果
正在处理1
操作后结果为2
正在处理2
操作后结果为4
正在处理3
操作后结果为6
操作完毕