1.Lazy Variables
惰性變量是按需初始化的存儲屬性,只能在struct或class中使用惰性變量。
例如,創(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標準庫中,SequenceType和CollectionType協(xié)議都有個叫lazy的計算屬性,它能返回一個特殊的LazySequence或LazyCollection。
這些類型只能被用到map、filter、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é)省的計算量就更明顯了。