Ios Swift getter重写非计算变量

Ios Swift getter重写非计算变量,ios,swift,getter,lazy-initialization,Ios,Swift,Getter,Lazy Initialization,在Objective-C中,能够做到这一点真的很容易,也很好 - (UIButton *)backButton{ if(!_backButton){ _backButton = [UIButton new]; } } 但是,在Swift中,当重写属性getter时,它被称为计算变量,并且每次访问self.backButton时,都会重新计算该变量。以下示例很好地说明了这一点: private var backButton: UIBarButto

在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变量一次,而不必将该代码放入初始化方法。

最好的方法可能是将其创建为一个惰性变量,这样初始化器将在第一次访问时被调用一次

lazy var backButton:UIBarButtonItem = {
    let button = ...
    return button
} ()

通过使用初始值设定项块,您可以提供实例变量的复杂初始化。

最好的方法可能是将其创建为惰性变量,这样初始值设定项将在第一次访问时被调用一次

lazy var backButton:UIBarButtonItem = {
    let button = ...
    return button
} ()

通过使用初始值设定项块,您可以提供实例变量的复杂初始化。

您所指的是“延迟实例化”。 您可以使用
lazy
关键字在swift中复制它:

private lazy var backButton: UIBarButtonItem = {
      let button = .....
      //....
      return button
 } ()

您所指的是“惰性实例化”。 您可以使用
lazy
关键字在swift中复制它:

private lazy var backButton: UIBarButtonItem = {
      let button = .....
      //....
      return button
 } ()

这实际上不起作用,因为底部需要
UIBarButtonItem={
然后()。@David答对了这实际上不起作用,因为底部需要
UIBarButtonItem={
然后()。@David答对了