有些网站建议使用延迟初始化而不是使用故事板来初始化视图.
它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"
}
}
Run Code Online (Sandbox Code Playgroud)
您的问题是根据您当前正在使用延迟初始化的误解而写的.但你不是.双方label1并label2没有使用延迟初始化.它们在初始化时立即A被初始化,这是错误的原因,因为self在调用这些属性初始值设定项时尚未准备好.
解决方案是实际制作label2一个懒惰的属性.
private lazy var label2: UILabel = {
let view = UILabel()
self.addTextToLabel(label: view)
return view
}()
Run Code Online (Sandbox Code Playgroud)
但请注意,label2直到您第一次真正尝试访问该label2属性时才会进行此初始化.
根据文档:
惰性存储属性是一个属性,其初始值在第一次使用之前不会计算.通过在声明之前编写惰性修饰符来指示延迟存储的属性.
当属性的初始值依赖于外部因素时,延迟属性非常有用,这些外部因素的值在实例初始化完成之后才知道.
参考:https: //docs.swift.org/swift-book/LanguageGuide/Properties.html