Swift的lazy关键字–延迟加载
来源:互联网 发布:翻译字幕的软件 编辑:程序博客网 时间:2024/06/05 00:57
定义
lazy属性就是初始值直到第一次使用的时候才执行计算的属性,这对小内存的手机所产生的性能上的优化是相当可观的。
注意:lazy属性必须是变量(var修饰符),因为常量属性(let修饰符)必须在初始化之前就有值,所以常量属性不能定义为lazy。
Objective-C中的延迟加载
Objective-C并没有在语法上支持延迟加载,通常是由程序员自己手动实现的。
示例如下:
@property (nonatomic, strong) NSArray *names;- (NSArray *)names { if (!_names) { _names = [[NSArray alloc] init]; NSLog(@"只在首次访问输出"); } return _names;}
说明:在初始化对象后,_names 是 nil。只有当首次访问 names 属性时 getter 方法会被调用,并检查如果还没有初始化的话,就进行赋值。可以想见,控制台打印的“只在首次访问输出”的确只会输出一次。我们之后再多次访问这个属性的话,因为 _names已经有值,因此将直接返回。
分析:getter方法和下划线语法对初学者并不是那么的友好,同时属性以及对应的getter方法空间上隔得比较远,代码逻辑不直观。
Swift的延迟加载
Swift中则可以通过lazy关键字简单地实现相同功能,比如上述示例代码在Swift中实现的话:
lazy var names: NSArray = { let names = NSArray() print("只在首次访问输出") return names}()
分析:相比起Objective-C中的实现,现在的lazy是在是简单的多了,而且更加的直观。除了上述直接在属性后面定义闭包调用的方法以外,还可以使用实例方法(func)和类方法(class func)来为lazy属性初始化添加必要的逻辑。
使用场景
延迟加载主要有以下两个使用的场景:
1. 属性的初始值依赖于其他的属性值,只有其他的属性值有值之后才能得出该属性的值。
2. 属性的初始值需要大量的计算。
高级用法
在Swift标准库中还有一组lazy方法,可以配合map、filter这类接受闭包并进行运行的方法一起,让整个行为变成延时进行的。以下是map函数的用法(示例取自喵神的Swifter):
let data = 1...3let result = data.lazy.map { (i: Int) -> Int in print("正在处理 \(i)") return i * 2}print("准备访问结果")for i in result { print("操作后结果为 \(i)")}print("操作完毕")
// 准备访问结果// 正在处理 1// 操作后结果为 2// 正在处理 2// 操作后结果为 4// 正在处理 3// 操作后结果为 6// 操作完毕
对于那些不需要完全运行,可能提前退出的情况,使用 lazy 来进行性能优化效果会非常有效。
参考链接:
1. 喵神:LAZY 修饰符和 LAZY 方法
2. Swiftist:Swift中的延迟加载
3. Apple developer
- Swift的lazy关键字–延迟加载
- Swift 延迟属性 lazy
- hibernate lazy(延迟加载) 的使用
- Hibernate 的延迟加载【lazy】属性
- 使用lazy load延迟图片的加载
- 关于延迟加载lazy的小结
- hibernate lazy延迟加载
- lazy 延迟加载策略
- 【Hibernate】lazy延迟加载
- Swift中延迟属性@lazy
- Swift下的Lazy懒加载模式
- Swift 懒加载(lazy)
- swift lazy 懒加载
- Swift- lazy 懒加载
- hibernate lazy(延迟加载)
- lazy loading(延迟加载)
- hibernate lazy(延迟加载)
- Hibernate之lazy延迟加载
- Windows下nginx+web.py+fastcgi服务搭建
- applePay 之 第一步merchantID和证书的生成
- Qt调用webserver完成登录操作
- CSS里的颜色简写(3位字母和6位字母)
- leetcode——14——Longest Common Prefix最长公共前缀
- Swift的lazy关键字–延迟加载
- editText限制输入的4种方法
- SQLSERVER2008 18456错误
- 开发工具控制台使用方法总汇
- vmstat命令详解
- .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));知多少
- Linux scp命令
- 关联查询 内连接 左右外连接 完全外连接
- 自定义RatingBar样式