在使用逃逸闭包捕获非逃逸参数时,需要将非逃逸参数标记为 @escaping,以确保逃逸闭包能够安全地访问它。
例如,以下代码中,func foo(_ closure: () -> Void) 接受一个非逃逸闭包作为参数,但该闭包在嵌套的闭包(逃逸闭包)中被捕获。由于捕获的闭包需要逃逸,因此closure需要标记为 @escaping。
func foo(_ closure: @escaping () -> Void) { 
    // 在嵌套的闭包中捕获闭包
    let nestedClosure = {
        closure()
    }
    // 调用嵌套闭包
    nestedClosure()
}
如果没有将非逃逸参数标记为 @escaping,Xcode将会抛出'Escaping closure captures non-escaping parameter”错误。
func foo(_ closure: () -> Void) { 
    // 错误示范:逃逸闭包捕获非逃逸参数
    let nestedClosure = {
        closure()
    }
    // 调用嵌套闭包
    nestedClosure()
}
                
            下一篇:捕获嵌套的接口值