美文网首页
Swift 懒加载Lazy

Swift 懒加载Lazy

作者: 雨泽Sunshine | 来源:发表于2022-06-23 16:21 被阅读0次

    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更复杂,那么节省的计算量就更明显了。

    相关文章

      网友评论

          本文标题:Swift 懒加载Lazy

          本文链接:https://www.haomeiwen.com/subject/kftmvrtx.html