Swift小知识点之懒加载(lazy)

一,懒加载情景

  • 全局的常量/变量都是懒加载的,不需要标记lazy;(补充:Swift的static和ObjC的不一样,只能在类型定义中使用

  • 标记为static的存储型的类型属性(常量变量)也是懒加载的,不需要标记lazy;(补充:static可以修饰存储型的和计算型的类型属性,class可以修饰类类型的计算型的类型属性

  • 延迟属性:必须使用lazy var标记;(延迟属性只能使用var修饰,不能使用let修饰

二,延迟属性与闭包

  • 延迟属性使用lazy var标记声明,其初始值可以使用直接方式创建,也可以使用闭包方式创建;

    // 直接方式创建
    lazy var person1: Person = Person()
    
    // 闭包方式创建
    lazy var person2: Person = {
        let person = Person()
        p.name = "Tom"
        print("Tom...")
        return person
    }()
  • 闭包不仅仅可以给延迟属性(lazy var)设置初始值,也可以给全局的常/变量、类的属性、对象的属性进行初始值,计算属性本质通过闭包实现的;

    let i = {
        return 0
    }()
    
    class Person {
        static let a = {
            return 1
        }()
    var b = { return 2 }() }
  • 在布局UI控件的时候,也可以使用闭包方式来完成初始化赋值,这样更便于复用、更简洁;

    let leftButton: UIButton = {
        let button = UIButton(frame: buttonSize)
        button.backgroundColor = .black
        button.titleLabel?.text = "left"
        return button
    }()
    
    let rightButton: UIButton = {
        let button = UIButton(frame: buttonSize)
        button.backgroundColor = .black
        button.titleLabel?.text = "right"
        return button
    }()
    
  • 延迟属性使用闭包方式创建,在闭包中使用self不会产生循环引用;全局的常/变量、类的属性、对象的属性使用闭包方式创建,在闭包中无法使用self;

posted on 2021-07-14 14:02  梁飞宇  阅读(2616)  评论(0)    收藏  举报