swift能否退出根闭包?
在Swift中,如果我在一个闭包中,那它本身就是另一个函数的内部,有没有办法退出函数本身 下面是一个使用GCDKit库中的闭包的示例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.")
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
以任何其他方式运行,它将(甚至可能)如何工作
你的例子只是同一事物的一个更复杂的版本<代码>返回退出关闭