【发布时间】:2014-11-04 16:31:23
【问题描述】:
在 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 变量的方法,而无需将该代码放入初始化方法中。
【问题讨论】:
标签: ios swift getter lazy-initialization