1.Lazy Variables
惰性变量是按需初始化的存储属性,只能在struct
或class
中使用惰性变量。
例如,创建一个带有惰性变量的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
协议都有个叫lazy
的计算属性,它能返回一个特殊的LazySequence
或LazyCollection
。
这些类型只能被用到map
、filter
、flatMap
这样的高阶函数中,而且是以一种惰性的方式。
对于那些不需要完全运行,可能提前退出的情况,使用lazy
来进行性能优化效果会非常有效。
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
更复杂,那么节省的计算量就更明显了。
网友评论