在Objective-C中,能够做到
真的很容易 - (UIButton *)backButton{
if(!_backButton){
_backButton = [UIButton new];
}
}
然而,在Swift中,当覆盖属性getter时,它被称为计算变量,每次访问self.backButton
时,都会重新计算变量。以下示例很好地说明了这一点:
private var backButton: UIBarButtonItem {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width*0.06, height: self.view.frame.size.width*0.06))
button.setImage(UIImage(named: "back_arrow"), forState: UIControlState.Normal)
button.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNext {
(next: AnyObject!) -> () in
self.navigationController?.popViewControllerAnimated(true)
return ()
}
println("Recalculating the button")
let item = UIBarButtonItem(customView: button)
return item
}
每次访问self.backButton时都会调用println语句。另外,打印出的内存地址也会每次都改变。我知道这是计算变量的本质,因为它们不存储在内存中。
这是一种类似的方式来复制Swift中Obj-C中看到的完全相同的行为吗?我想要的只是一种实例化一些UI变量的方法,而不必将该代码放在初始化方法中。
答案 0 :(得分:4)
最好的方法是将它创建为一个惰性变量,这样初始化程序将在第一次被访问时被调用一次。
lazy var backButton:UIBarButtonItem = {
let button = ...
return button
} ()
通过使用初始化程序块,您可以提供实例变量的复杂初始化。
答案 1 :(得分:2)
你所指的是“懒惰的实例化”。
您可以使用lazy
关键字快捷地重现它:
private lazy var backButton: UIBarButtonItem = {
let button = .....
//....
return button
} ()