如何在Swift的延迟初始化中使用self

时间:2018-09-23 05:49:53

标签: swift

某些网站建议使用延迟初始化而不是使用情节提要来初始化视图。

当延迟初始化中未使用self时,它可以工作。 但是,如果在其中使用self,则会发生编译错误。

例如,在下面的代码中,label1可以成功编译,但是label2无法编译,因为其中使用了self

如何在延迟初始化中使用self

class A {
    private let label1: UILabel = {
        return UILabel()
    }()

    private let label2: UILabel = {
        let view = UILabel()
        self.addTextToLabel(view) // compile error !!!
        return view
    }()

    private func addTextToLabel(label: UILabel) {
        label.text = "test"
    }
}

1 个答案:

答案 0 :(得分:6)

您的问题是在您当前正在使用惰性初始化的误解下写的。但是你不是。 label1label2均未使用延迟初始化。它们在初始化A时立即被初始化,这是导致错误的原因,因为在调用这些属性初始值设定项时self尚未准备就绪。

解决方案是实际上使label2成为惰性属性。

private lazy var label2: UILabel = {
    let view = UILabel()
    self.addTextToLabel(label: view)
    return view
}()

但是请注意,这种label2初始化要在您第一次尝试访问label2属性时才会发生。

根据文档:

  

惰性存储属性是一种属性,其初始值要在首次使用时才计算。您可以通过在声明之前编写lazy修饰符来表示一个惰性存储属性。

     

当属性的初始值取决于实例初始化完成后才知道其值的外部因素时,惰性属性很有用。

参考: https://docs.swift.org/swift-book/LanguageGuide/Properties.html