以下三种格式,都不会报错,可是,在编写代码时会有一些问题
1
lazy var headerImageView:UIImageView = {
let headerImageView:UIImageView = UIImageView(frame:CGRect.init(x: 0, y: 0, width: self.view.bounds.width, height: 125))
headerImageView.image = UIImage.init(named: "header-contact")
return headerImageView
}()
2
lazy var headerImageView:UIImageView = {
let headerImageView = UIImageView(frame:CGRect.init(x: 0, y: 0, width: self.view.bounds.width, height: 125))
headerImageView.image = UIImage.init(named: "header-contact")
return headerImageView
}()
3
lazy var headerImageView:UIImageView = {
let headerImageView = UIImageView(frame:CGRect.zero)
headerImageView.image = UIImage.init(named: "header-contact")
return headerImageView
}()
1和2的差别在于,1使用UIImageView
创建了一个对象,并在前面声明了对象类型。结果就是1在输入闭包的第二行代码时有代码提示,而2没有。1中通过类型推断可以得出headerImageView
是一个UIImageView
对象,而2中确是一个<<error, type>>
原因可以在3中找到答案:使用了self
在懒加载中的self
似乎很有问题。
- 如果闭包中没有出现过
self
那么在断点调试的时候也不会得到self
对象的内容;可如果出现过,那么在断点调试就可以得到内容; -
lazy
闭包中的self
没有代码提示(起码我是这样的);可是硬把代码刚出来后,确也跑得过;代码跳转什么的完全不是问题; - 就是上面提到的
那么问题来了~!
Why~~~~ 😕