Swift 懒加载Lazy

2022-06-23  本文已影响0人  雨泽Sunshine

1.Lazy Variables

惰性变量是按需初始化的存储属性,只能在structclass中使用惰性变量。
例如,创建一个带有惰性变量的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协议都有个叫lazy的计算属性,它能返回一个特殊的LazySequenceLazyCollection
这些类型只能被用到mapfilterflatMap这样的高阶函数中,而且是以一种惰性的方式。
对于那些不需要完全运行,可能提前退出的情况,使用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

使用lazy后,计算量明显降低很多。如果array的体量更大,且increment更复杂,那么节省的计算量就更明显了。

上一篇 下一篇

猜你喜欢

热点阅读