首页 > 解决方案 > 如何将闭包作为变量传递?

问题描述

我有来自操场的以下代码:

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在s init 中,我为该闭包SomeView赋值。pressed当然,在初始化时,它是nil. 但是在初始化之后,我给那个闭包SomeView赋值。buttonDidPressed因为,闭包是引用类型,当view.press被调用时,buttonDidPressed不应该是 nil。但是,无论如何,我的打印没有执行。为什么?

标签: swiftclosures

解决方案


您首先初始化SomeViewinit函数被调用),然后设置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()

推荐阅读