美文网首页
lazy修饰符和lazy方法

lazy修饰符和lazy方法

作者: TomatosX | 来源:发表于2017-07-25 11:14 被阅读11次

    我们在第一次访问某个属性时,判断这个属性背后的存储是否已经存在,如果存在则直接返回,如果不存在则说明是首次访问,那么就进行初始化并存储后再返回。这样我们可以把这个属性的初始化时刻推迟,与包含它的对象的初始化时刻分开,以达到提升性能的目的。

    对于一个属性是由复杂计算得到值得话,我们可以声明一个lazy属性的方法。

    class ClassLazy {
        
        lazy var str: String = {
            let str = "Hello"
            print("只在首次访问输出")
            return str
        }()
    }
    

    如果只是一个简单的赋值,我们直接声明一个属性即可。

    lazy var str1 = "Hello Str1"
    

    另外,lazy也可以用在集合中。
    如下我们有两个迭代。

    let data = 1...3
    let dataResult = data.map { (i: Int) -> Int in
        print("正在处理\(i)")
        return i * 2
    }
    print("准备访问结果")
    for i in dataResult {
        print("操作后结果为\(i)")
    }
    print("操作完毕")
    

    输出结果:
    正在处理1
    正在处理2
    正在处理3
    准备访问结果
    操作后结果为2
    操作后结果为4
    操作后结果为6
    操作完毕

    如果循环不需要完全执行,可能存在提前退出的话,我们可以在map的前面加一个lazy修饰来进行性能优化效果会非常明显:

    let data = 1...3
    let dataResult = data.lazy.map { (i: Int) -> Int in
        print("正在处理\(i)")
        return i * 2
    }
    print("准备访问结果")
    for i in dataResult {
        print("操作后结果为\(i)")
    }
    print("操作完毕")
    

    输出结果:
    准备访问结果
    正在处理1
    操作后结果为2
    正在处理2
    操作后结果为4
    正在处理3
    操作后结果为6
    操作完毕

    相关文章

      网友评论

          本文标题:lazy修饰符和lazy方法

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