Swift 懒性属性

及时求值与懒性求值

及早求值:尽可能早的计算表达式的值,以便在使用时直接使用。

懒性求值(Lazy evaluation):将代码中求值延迟到需要结果值时再进行。

在一般的开发中,苹果希望我们以及早求值的方式进行编程,但是懒性加载可以提高性能和便利性,我们可以适当添加懒性求值。

懒加载应用

Objective-C 中的懒加载

OC中是通过判断是否含有值,如果有就直接返回值,没有就创建对象返回。

// ClassA.h
@property (nonatomic, copy) NSString *testString;// ClassA.m
- (NSString *)testString {if (!_testString) {_testString = @"Hello";NSLog(@"只在首次访问输出");}return _testString;
}

Swift中的懒加载

在 Swift 中我们可以通过 lazy 属性修饰符来指定属性为懒加载属性。

示例:

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

简单的懒加载可以这样写

lazy var str: String = "Hello Lazy"

Swift 标准库的 lazy 方法

在标准库中,常用基本类型(字典、字符串、数组)具有一个 lazy 属性,可以获取来进行懒性求值的操作(比如 map、filter等)

比如进行数组 map 操作

及早求值

let data = 1...3
let result = data.map {  (i: Int) -> Int inprint("正在处理 \(i)")return i * 2
}// result 在此时就会使用资源计算出来。print("准备访问结果")
for i in result {  print("操作后结果为 \(i)")
}print("操作完毕")

输出:

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

懒性求值

let data = 1...3
let result = data.lazy.map {    // 先进行一次 lazy 操作(i: Int) -> Int inprint("正在处理 \(i)")return i * 2
}  // 懒操作,不做计算处理。print("准备访问结果")
for i in result { // 访问的时候再处理,而且是操作哪个再处理哪个。 print("操作后结果为 \(i)")
}print("操作完毕")

输出:

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

可以看到,懒性求值在需要的时候才进行值操作。

应用场景

  1. 可能存在大量资源占用,可以把部分属性声明为 lazy, 比如 ViewController 声明,就存在页面初始化需要加载 xib 和初始化化各种属性。此时部分属性就可以用 lazy 进行懒性求值,以缓解性能。
  2. 数据量大,比如大容量数组进行 map , filter 操作时,可以先获取 lazy 容器,以便用到才计算参考
  3. 对外暴露的属性,也可通过 lazy 懒操作,以便外部使用时候才计算。不用一开始初始化就进行大量计算和占用资源参考。
  4. 声明需要使用才计算的属性参考。

更多懒操作可以查看官网文档LazySequence

注意

进行 lazy 属性声明时候,如果使用 self 请使用[unowned self] 或者 [weak self] 来避免循环引用。

Lazy 属性不是线程安全的。

参考

Swift lazy 修饰符和方法 – 王巍

懒性求值 – IBM

Swift 标准库的条件符合性 – Swift 官方文档关于Lazy的介绍

什么是惰性变量 – hackingWithSwift 告诉你可以通过懒性计算来避免昂贵的计算操作。

Swift 懒性属性相关推荐

  1. Swift 扩展存储属性

    Swift扩展存储属性 Swift默认只能扩展计算属性无法扩展存储属性,如果想扩展存储属性就需要使用runtime. 使用runtime的两个核心方法(关联对象) /// 设置值 /// - 参数1: ...

  2. swift面向对象之属性

    swift面向对象之属性 swift属性 存储属性 可以存储常量和变量 惰性存储属性 语法:lazy var 变量 惰性存储属性只有在用的时候才会完成真正的初始化,刚开始的初始化代码只是类型占位,并没 ...

  3. FSP语言学习(九):安全性和活泼性属性

    目录 1. 引言 2. Safety 2.1 Safety Properties 2.2 Safety Property for Mutual Exclusion 3. 单线桥问题 3.1 Singl ...

  4. swift_043(Swift 懒加载(lazy) )

    懒加载的优点 懒加载(lazy load),其实是延时加载,它的优点显而易见,首先,懒加载将对象的创建延迟到了需要对象的时候,这样减少了内存开销:其次,懒加载将创建对象.相关属性设置内聚在一个&quo ...

  5. swift懒加载(lazy load)VS OC懒加载

    为什么80%的码农都做不了架构师?>>>    懒加载可以让你不用关心变量的创建时机,等到真正使用的时候才去创建并且能保证在使用的时候已经初始化完毕,在一定程度上可以提高性能. OC ...

  6. Swift Property Wrapper 属性包装器

    @propertyWrapper属性包装器:在定义存储属性时添加一个分离层,代表该属性被包装起来,且在包装器内部可以做一些事情.把一些通用复用的代码放在了包装器中,比如线程安全检查或者数据存储到数据库 ...

  7. php计算属性集的闭包,关于swift:计算属性与带闭包的属性集之间的区别

    我是Swift的新手. 计算属性和设置为闭包的属性之间有什么区别? 我知道每次都会重新计算一个计算属性. 封盖是否有所不同? 即 关闭: var pushBehavior: UIPushBehavio ...

  8. swift_020(Swift 的属性)

    //***********swift学习之20--属性--*************************** // 属性比较属性,不需要介绍太多,只知道还可以定义属性观察器来监控属性值的变化,以此 ...

  9. Swift中如何重新懒加载

    2019独角兽企业重金招聘Python工程师标准>>> 在OC中,重新让一个控件重新调用懒加载方法只需要把这个控件指向nil. self.<控件> = nil; 但是Sw ...

最新文章

  1. 深入剖析Redis系列(七) - Redis数据结构之列表
  2. C语言设计ATM存取款界面
  3. http默认超时时间_Bof 是一个HTTP客户端,旨在尽可能方便用户使用
  4. 初学者先学python语音好吗_献给Python初学者 零基础学习Python能学会吗
  5. 5.16 Stacks and Queues
  6. geth rpc无法开启_三分了解以太坊 Geth 客户端快照加速机制
  7. matlab mpt工具箱帮助文档_替代 Matlab 的国产软件出现?
  8. Java BigDecimal plus()方法与示例
  9. hadoop中unhealthynodes的问题解决
  10. mse均方误差计算公式_PCA的两种解读:方差最大与均方误差最小的推导
  11. php cli输出百分比,CLI模式。能不能修改已经输出的内容?
  12. 一体化服务器和oracle集群,4种Oracle DBaaS部署模式,你在使用哪一种?
  13. 递推+高精度 UVA 10497 Sweet Child Makes Trouble(可爱的孩子惹麻烦)
  14. python多线程和多进程
  15. android studio moudel,Android Studio中Project和Module的关系
  16. java并发测试工具_Java并发测试工具类
  17. PLC系统调试的步骤
  18. Eclipse中快捷键组合
  19. 背靠Mobileye/降价抢市场,经纬恒润闯关IPO背后“危机四伏”
  20. 关于c语言学习的建议

热门文章

  1. sdio接口_多种接口的谷歌Coral模块,总有一款适合您~
  2. python - paramiko模块 修改logging提示为静默
  3. Rabbit 安装步骤
  4. Fluently NHibernate 插入CLOB字段
  5. android系统各个输出log对应层次文件
  6. JDK5 新特性之 可变参数的方法(2)---asList
  7. java中二维数组求最大值代码。。。。。。不懂呀
  8. ThreadLocal 简介
  9. DHCP服务器的搭建
  10. 致所有IT工程师的信(网络工程师的发展方向)