lazy修饰符和lazy方法

2017-07-25  本文已影响11人  TomatosX

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

对于一个属性是由复杂计算得到值得话,我们可以声明一个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
操作完毕

上一篇 下一篇

猜你喜欢

热点阅读