某些网站建议使用延迟初始化而不是使用情节提要来初始化视图。
当延迟初始化中未使用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"
}
}
答案 0 :(得分:6)
您的问题是在您当前正在使用惰性初始化的误解下写的。但是你不是。 label1
和label2
均未使用延迟初始化。它们在初始化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