延時(shí)加載或者說(shuō)延時(shí)初始化時(shí)很常用的優(yōu)化方法。
在特定環(huán)境下才會(huì)使用到的存儲(chǔ)屬性,可以使用 lazy
class ClassA {
// 延時(shí)初始化
lazy var str: String = {
let str = "Hello"
print("只在首次訪問(wèn)時(shí)輸出")
return str
}()
// 如果不需要做什么額外的工作,可以簡(jiǎn)化成
lazy var str1: String = "hello1"
}
/*
lazy 可以結(jié)合? map/ filter 這類(lèi)閉包并進(jìn)行運(yùn)行的方法一起,讓這個(gè)行為變成延時(shí)進(jìn)行的,對(duì)性能也是有不小的提升
*/
// 直接使用 map
//let data = 1...3
//let result = data.map { (i) -> Int in
//? ? print("正在處理:\(i)")
//? ? return i * 2
//}
//print("準(zhǔn)備訪問(wèn)結(jié)果")
//for i in result {
//? ? print("操作后結(jié)果為:\(i)")
//}
//print("操作完畢")
/*
輸出為:
正在處理:1
正在處理:2
正在處理:3
準(zhǔn)備訪問(wèn)結(jié)果
操作后結(jié)果為:2
操作后結(jié)果為:4
操作后結(jié)果為:6
操作完畢
*/
let data = 1...3
let result = data.lazy.map { (i) -> Int in
print("正在處理:\(i)")
return i * 2
}
print("準(zhǔn)備訪問(wèn)結(jié)果")
for i in result {
print("操作后結(jié)果為:\(i)")
}
print("操作完畢")
/*
輸出為:
準(zhǔn)備訪問(wèn)結(jié)果
正在處理:1
操作后結(jié)果為:2
正在處理:2
操作后結(jié)果為:4
正在處理:3
操作后結(jié)果為:6
操作完畢
*/
// 總結(jié): 對(duì)于那些不需要完全運(yùn)行,肯恩提前退出的情況,使用 lazy 來(lái)進(jìn)行性能優(yōu)化效果會(huì)非常有效