可以快速退出根关闭?

时间:2016-05-29 20:19:32

标签: 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.")
    }
}

2 个答案:

答案 0 :(得分:4)

不,没有。闭包在独立环境中运行。据您所知,在执行闭包时,调用test()的线程不再执行test()方法。

答案 1 :(得分:1)

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

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?"

这里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以任何其他方式行事,它将如何(甚至可能)起作用。

你的例子只是同一件事的一个更复杂的版本。 return退出关闭。