我有来自游乐场的以下代码:
class MyButton {
var pressed: (() -> Void)?
func press() {
pressed?()
}
}
class SomeView {
var buttonDidPressed: (() -> Void)?
let button = MyButton()
init() {
button.pressed = buttonDidPressed
}
func press() {
button.press()
}
}
let view = SomeView()
view.buttonDidPressed = {
print("pressed")
}
view.press()
MyButton
具有pressed
在press
调用时执行的闭包。在SomeView
s init中,我为该pressed
闭包赋值。当然,在初始化时是nil
。但是,在初始化之后SomeView
,我为该buttonDidPressed
闭包赋值。因为闭包是引用类型,所以在view.press
调用时buttonDidPressed
不应为nil。但是,无论如何,我的打印没有执行。为什么?
这是我想达到的目标:
class SomeView {
var buttonDidPressed: (() -> Void)? = nil {
didSet {
button.pressed = buttonDidPressed
}
}
let button = MyButton()
func press() {
button.press()
}
}
你的代码是不工作的原因是因为SomeView.init
,buttonDidPressed
是nil
-也就是说,它的缺乏参考。所以:
buttonDidPressed = nil
button.pressed = buttonDidPressed
// is equivalent to
button.pressed = nil
以后分配新的(或不同的)引用buttonDidPressed
不会更改该button.pressed
属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句