在Swift中,如果我在一个闭包内部,那本身就是另一个函数,有没有办法退出函数本身?
以下是使用GCDKit库中的闭包的示例。
func test() {
GCDQueue.Default.async {
print("Print me!")
return //Is there a statement that does this?
}.notify(.Main) {
print("Never print me.")
}
}
答案 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
退出关闭。