0

我在链接中遇到了这种奇怪的闭包用法

以下代码是 Xcode Playground 中的简化版本

typealias AppStateDeeplinkAction   = () -> ()

var deeplinkBlock : AppStateDeeplinkAction? = {
    print ("this is for deeplink")
}

func deeplinkAction() {
    if let deeplinkAction = deeplinkBlock {
        print("deeplink is executed")
        deeplinkAction() // <- if this is commented out, the result is just "deeplink is executed"
    }
}

deeplinkAction() 

这样做的结果是,

deeplink is executed
this is for deeplink

令人困惑的是,在 if-let 中调用了 deeplinkAction() 函数,并且没有编译/运行时错误。它成功地结束了。我不太明白的是 deeplinkAction() 的递归调用。

与此相比,如果将 deeplinkAction() 注释掉,结果只是

deeplink is executed

我错过了什么样的“关闭”功能?我该如何解释这个?

4

1 回答 1

2

这里没有递归调用,但是对可选的绑定闭包变量使用与封闭函数相同的名称会产生误导,因此是个坏主意。

只需重命名它,一切都会清楚。闭包变量后面的括号执行所说的闭包,所以deeplinkBlock()执行deeplinkBlock变量中存储的闭包。

typealias AppStateDeeplinkAction = () -> ()

var deeplinkBlock : AppStateDeeplinkAction? = {
    print ("this is for deeplink")
}

func deeplinkAction() {
    if let deeplinkBlock = deeplinkBlock {
        print("deeplink is executed")
        deeplinkBlock()
    }
}

deeplinkAction() 

实际上,无论如何都不需要可选绑定,您也可以在闭包上使用可选链接。

func deeplinkAction() {
    deeplinkBlock?()
}
于 2020-11-26T17:35:32.713 回答