在 Swift 开发中,闭包(Closure)是非常强大的特性,但当我们处理异步操作时,通常需要用到 逃逸闭包(@escaping)。今天通过几个简单的例子来看它是什么以及如何使用。
1. 什么是逃逸闭包?
如果一个闭包被作为一个参数传递给函数,并且在函数返回之后才被调用,那么这个闭包就称为“逃逸”了(即逃离了函数的作用域)。
在 Swift 中,如果闭包可能在函数执行结束后才执行,我们必须在函数定义的参数类型前标注 @escaping
2. 代码示例
不使用 @escaping(非逃逸,默认)
func doSomething(action: () -> Void) {
print("函数开始")
action() // 在函数返回前被执行
print("函数结束")
}
doSomething {
print("闭包执行")
}
// 输出: 函数开始 -> 闭包执行 -> 函数结束
使用 @escaping(逃逸)
当我们在网络请求或延迟操作中使用闭包时:
var completionHandlers: [() -> Void] = []
// 需要用 @escaping 标记,因为 action 会在函数外被存储
func fetchData(completion: @escaping () -> Void) {
print("开始网络请求...")
// 异步操作:延迟 2 秒执行
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
print("网络请求完成")
completion() // 此时函数 fetchData 已经结束,所以必须是逃逸的
}
}
fetchData {
print("处理结果")
}