我有来自 playground 的以下代码:
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
的初始化中,我为那个 pressed
闭包赋值。当然,在初始化时,它是 nil
。但是在 SomeView
初始化之后,我为那个 buttonDidPressed
闭包赋值。因为,闭包是引用类型,当 view.press
被调用时, buttonDidPressed
不应该是 nil。但是,无论如何,我的打印没有执行。为什么?
最佳答案
您首先初始化 SomeView
(调用 init
函数),然后设置 buttonDidPressed
属性。因此,buttonDidPressed
属性具有您的闭包,但从未将其传递给 MyButton
实例。
您可以使用didSet
立即更新它:
class SomeView {
var buttonDidPressed: (() -> Void)? {
didSet {
button.pressed = buttonDidPressed
}
}
let button = MyButton()
func press() {
button.press()
}
}
更新:您还可以像这样在 SomeView
的初始化程序中传递闭包:
class SomeView {
let button = MyButton()
init(buttonDidPressed: (() -> Void)?) {
button.pressed = buttonDidPressed
}
func press() {
button.press()
}
}
let view = SomeView {
print("pressed")
}
view.press()
关于swift - 如何将闭包作为变量传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64124296/