Swift 懒加载Lazy

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
  • 直接使用map,所有的输出值都被计算出来了!即使只读了第5个元素。
  • 使用了lazy,仅调用了第5个元素的计算,其他元素计算并不会被调用。

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容