Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift能否退出根闭包?_Swift_Closures - Fatal编程技术网

swift能否退出根闭包?

swift能否退出根闭包?,swift,closures,Swift,Closures,在Swift中,如果我在一个闭包中,那它本身就是另一个函数的内部,有没有办法退出函数本身 下面是一个使用GCDKit库中的闭包的示例 func test() { GCDQueue.Default.async { print("Print me!") return //Is there a statement that does this? }.notify(.Main) { print("Never print me.")

在Swift中,如果我在一个闭包中,那它本身就是另一个函数的内部,有没有办法退出函数本身

下面是一个使用GCDKit库中的闭包的示例

func test() {
    GCDQueue.Default.async {
        print("Print me!")
        return //Is there a statement that does this?
    }.notify(.Main) {
        print("Never print me.")
    }
}

不,没有。闭包在自包含的环境中运行。您知道,在执行闭包时,调用<代码>测试()>代码>的线程不再执行<代码>测试()/代码>方法。

让我们考虑一个更简单的版本,它不包括任何第三方库、额外队列或其他复杂性。我们将创建一个闭包并立即执行它

func dothing(andPrint shouldPrint: Bool) {
    let closure = {
        guard shouldPrint else { return }
        print("I printed!")
    }

    closure()
    print("did it return?")
}

dothing(andPrint: false) // Prints "did it return?"
此处的
返回
将退出闭包,而不是
dothing
。由于
closure
可以传递给其他函数,或者存储在属性中,并在稍后的某个时间执行(可能是在您的示例中的另一个队列上),因此
return
无法退出自身以外的任何内容。考虑一下,如果我们要把闭包的创建重构成它自己的函数:

func fetchClosure(andPrint shouldPrint: Bool) -> () -> Void {
    return {
        guard shouldPrint else { return }
        print("I printed!")
    }
}

func dothing(andPrint shouldPrint: Bool) {
    let closure = fetchClosure(andPrint: shouldPrint)

    closure()
    print("did it return?")
}

dothing(andPrint: false) // Prints "did it return?"
这应该不会令人惊讶,因为它具有相同的行为(否则这将不是一个简单的重构)。现在想象一下,如果
return
以任何其他方式运行,它将(甚至可能)如何工作

你的例子只是同一事物的一个更复杂的版本<代码>返回退出关闭