Ios Don';我不理解Coordinate/State管理模式中的闭包用法

Ios Don';我不理解Coordinate/State管理模式中的闭包用法,ios,swift,closures,coordination,Ios,Swift,Closures,Coordination,我在文章中遇到过这种奇怪的闭包用法 下面的代码是Xcode中的简化版本 typealias AppStateDeeplinkAction = () -> () var deeplinkBlock : AppStateDeeplinkAction? = { print ("this is for deeplink") } func deeplinkAction() { if let deeplinkAction = deeplinkBlock {

我在文章中遇到过这种奇怪的闭包用法

下面的代码是Xcode中的简化版本

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() 

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

与此相比,如果deeplinkAction()被注释掉,则结果仅为

deeplink is executed

我缺少什么样的“关闭”功能?我应该如何解释这一点?

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

只要重新命名它,一切都会变得清晰。闭包变量后的括号执行所述闭包,因此
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?()
}

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

只要重新命名它,一切都会变得清晰。闭包变量后的括号执行所述闭包,因此
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?()
}

我会给它们起不同的名字,如果let:
如果let other=deeplinklBlock{print…other()}
。当你做一个
if let
的时候也是一样的,你把它命名为var。这可能会让人困惑,而且可能会让人不愿意把这个方法命名为var。是的,我现在很清楚了。非常感谢~if let:
if let other=deeplinklBlock{print…other()}
,我会给它们起不同的名字。当你做一个
if let
的时候也是一样的,你把它命名为var。这可能会让人困惑,而且可能会让人不愿意把这个方法命名为var。是的,我现在很清楚了。非常感谢~