【问题标题】:Swift getter override non-computed variableSwift getter 覆盖非计算变量
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 这实际上是行不通的,因为你需要UIBarButtonItem = {,然后是底部的()。 @David 做对了
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2014-11-29
      • 2017-01-08
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多