Swift 中的逃逸闭包 @escaping

  • Post category:Swift

在 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("处理结果")
}