lazy修饰符和lazy方法

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

对于一个属性是由复杂计算得到值得话,我们可以声明一个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 class C...
    fordring2008阅读 497评论 0 0
  • 延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些...
    简了个书1993阅读 890评论 0 0
  • swift属性的延迟加载你一定不陌生 lazy var str:String = "Hello" 而我们今天关注的...
    sprint阅读 1,491评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,382评论 11 349