我們在第一次訪問某個屬性時,判斷這個屬性背后的存儲是否已經(jīng)存在,如果存在則直接返回,如果不存在則說明是首次訪問,那么就進(jìn)行初始化并存儲后再返回。這樣我們可以把這個屬性的初始化時刻推遲,與包含它的對象的初始化時刻分開,以達(dá)到提升性能的目的。
對于一個屬性是由復(fù)雜計算得到值得話,我們可以聲明一個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("準(zhǔn)備訪問結(jié)果")
for i in dataResult {
print("操作后結(jié)果為\(i)")
}
print("操作完畢")
輸出結(jié)果:
正在處理1
正在處理2
正在處理3
準(zhǔn)備訪問結(jié)果
操作后結(jié)果為2
操作后結(jié)果為4
操作后結(jié)果為6
操作完畢
如果循環(huán)不需要完全執(zhí)行,可能存在提前退出的話,我們可以在map
的前面加一個lazy
修飾來進(jìn)行性能優(yōu)化效果會非常明顯:
let data = 1...3
let dataResult = data.lazy.map { (i: Int) -> Int in
print("正在處理\(i)")
return i * 2
}
print("準(zhǔn)備訪問結(jié)果")
for i in dataResult {
print("操作后結(jié)果為\(i)")
}
print("操作完畢")
輸出結(jié)果:
準(zhǔn)備訪問結(jié)果
正在處理1
操作后結(jié)果為2
正在處理2
操作后結(jié)果為4
正在處理3
操作后結(jié)果為6
操作完畢