gpt4 book ai didi

ios - Swift getter 覆盖非计算变量

转载 作者:搜寻专家 更新时间:2023-11-01 05:59:28 27 4
gpt4 key购买 nike

在 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
} ()

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

关于ios - Swift getter 覆盖非计算变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com