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

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