Swift 懶加載Lazy

1.Lazy Variables

惰性變量是按需初始化的存儲屬性,只能在structclass中使用惰性變量。
例如,創(chuàng)建一個帶有惰性變量的Person結構來計算BMI:

struct Person {
    var weight: Double
    var height: Double
    
    lazy var BMIIndex: Double = {
        return weight / pow(height, 2)
    }()
}

當初始化Person對象時,BMI不會自動計算。而是在第一次引用的時候才計算:

var jack = Person(weight: 90, height: 120)
print(jack.BMIIndex)

2.Lazy Sequences

Swift標準庫中,SequenceTypeCollectionType協(xié)議都有個叫lazy的計算屬性,它能返回一個特殊的LazySequenceLazyCollection。
這些類型只能被用到mapfilter、flatMap這樣的高階函數中,而且是以一種惰性的方式。
對于那些不需要完全運行,可能提前退出的情況,使用lazy來進行性能優(yōu)化效果會非常有效。

func increment(x: Int) -> Int {
    print("訪問:\(x)")
    return x + 1
}

let array = Array(0..<10)

print("直接使用map的結果")
let incrementArr = array.map(increment)
print(incrementArr[5])

print("\n使用lazy屬性的結果")
let lazyIncrementArr = array.lazy.map(increment)
print(lazyIncrementArr[5])

輸出的結果:

直接使用map的結果:
訪問:0
訪問:1
訪問:2
訪問:3
訪問:4
訪問:5
訪問:6
訪問:7
訪問:8
訪問:9
6

使用lazy屬性的結果:
訪問:5
6
  • 直接使用map,所有的輸出值都被計算出來了!即使只讀了第5個元素。
  • 使用了lazy,僅調用了第5個元素的計算,其他元素計算并不會被調用。

使用lazy后,計算量明顯降低很多。如果array的體量更大,且increment更復雜,那么節(jié)省的計算量就更明顯了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容