swift - 如何将闭包作为变量传递?

标签 swift closures

我有来自 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/

相关文章:

ios - 在 swift 3 中传递地址时在 map 中获取 "Cannot provide direction"?

swift - 如何快速检查 `Any(not Any?)` 是否为零

swift - 在 Swift 3 中使用指针修改数据

swift - 在 Swift 中类型转换闭包?

c# - 同步集合 : ReSharper "Implicitly captured closure"

ios - Swift iOS 如何从另一个警报消息的处理程序中显示警报消息

javascript - Javascript 中的闭包遇到问题

Javascript 闭包 - 无法在 IIFE 函数中保存 "count' 的副本

javascript - 是否可以在 JavaScript 函数内从调用者的作用域访问变量?

javascript - 基本闭包示例困惑