swift 中的 lazy

作者: Inlight先森 | 来源:发表于2017-12-20 11:36 被阅读45次

概念

  • 延迟加载是初始化很常用的性能优化方式,尤其是在一些对象的属性十分复杂的时候,默认全部初始化会耗费不少时间,影响性能。还有一些特定环境下才使用的对象,更是浪费资源。所以有些时候我们并不会立刻用到一个对象或者一个对象的所有属性,使用延迟加载可以提升性能。
  • 所谓延迟加载就是在第一次访问某个属性时,要判断这个属性是否已经被初始化,如果已经初始化则直接返回,若没有初始化则进行初始化。这样可以把这个属性延迟初始化,把它和包含它的对象的初始化分隔开,来达到提升性能的目的。

使用

swift 中我们在变量属性前加 lazy 关键字来指定延迟加载。

OC 中可能是这样的:

@property (copy, nonatomic) NSString *name;

- (NSString *)name {
    if (!_name) {
        _name = @"Inlight";
    }
    return _name;
}

swift 中我们在使用 lazy 修饰属性时,必须声明属性是变量。而且我们需要显示的指定属性的类型。对该属性进行一个赋值语句用来首次访问时使用。

swift 使用方式:

    lazy var name: String = "Inlight"
    
    lazy var planNameLabel: UILabel = {
        let label = UILabel()
        label.text = "yo yo yo kongfu!"
        return label
    }()

拓展

lazy 还可以配合 map filter 这类接受闭包运行的方法一起,使整个行为变成延迟进行的。

    let numbers = 1...5
    let doubleNumbers = numbers.map { (i: Int) -> Int in
        print("numbers\(i)")
        return i * 2
    }

    for i in doubleNumbers {
        print("doubleNumbers\(i)")
    }

打印结果:

numbers1
numbers2
numbers3
numbers4
numbers5
doubleNumbers2
doubleNumbers4
doubleNumbers6
doubleNumbers8
doubleNumbers10

使用 lazy 后得到延迟运行版本的容器

    let numbers = 1...5
    let doubleNumbers = numbers.lazy.map { (i: Int) -> Int in
        print("numbers\(i)")
        return i * 2
    }

    for i in doubleNumbers {
        print("doubleNumbers\(i)")
    }

打印结果:

numbers1
doubleNumbers2
numbers2
doubleNumbers4
numbers3
doubleNumbers6
numbers4
doubleNumbers8
numbers5
doubleNumbers10

对于一些不需要完全运行或者提前退出的情况,使用 lazy 进行性能优化更加有效。

相关文章

  • swift 中的 lazy

    概念 延迟加载是初始化很常用的性能优化方式,尤其是在一些对象的属性十分复杂的时候,默认全部初始化会耗费不少时间,影...

  • swift 中的 Lazy

    前言 lazy,延迟加载,以前只知道延迟属性,这个和 OC 中很多时候重写 getter 方法类似,只是今天看到 ...

  • Swift总结4:UI控件 单例 代理 懒加载 网络请求 闭包

    //懒加载//swift中固定写法lazy var l:UILabel = { //viewDidLoad中vie...

  • swift 中 Lazy,deinit用法

    * swift中懒加载写法,懒加载在Swift中是一个闭包。 懒加载详细介绍看这里 * OC中的dealloc方法...

  • Swift Collection 中的 lazy 作用

    惰性求值 惰性求值常见于函数式编程中,也有人把惰性求值翻译成延迟求值(Lazy Evaluation)。它的目的是...

  • Framework: lazy symbol bind fail

    Framework: lazy symbol bind failed 解决记录 XCode Swift 兼容问题 ...

  • Swift中懒加载

    在Swift中对控件进行懒加载比oc中方便很多,只要lazy前缀,oc中懒加载方法,重写getter方法.Swif...

  • Swift里的lazy

    惰性初始化,就是在变量第一次使用的时候才进行初始化。 Swift中,有两种方式来惰性初始化。 第一种,简单表达式 ...

  • swift —— tips swift 中的懒加载实现

    objc objc 对象的懒加载 swift swift 的懒加载 方式 1lazy 保证数据在用到的时候才会被加...

  • Swift:)懒加载Lazy

    OC中,要实现懒加载是用到getter方法,例如 Swift懒加载差别就很大了,懒加载属性用lazy修饰,注意结尾...

网友评论

    本文标题:swift 中的 lazy

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