什么是Swift中的转义闭包的好例子?

7 closures escaping swift

我正在阅读Swift编程语言手册,它提到了一个逃避关闭.关于转义闭包,我不知道它们的意思是"闭包作为参数传递给函数,但在函数返回后调用." 有人可以提供一个逃避闭包的例子吗?

Rob*_*Rob 11

转义闭包的一个例子是一些异步任务中的完成处理程序,例如发起网络请求:

func performRequest(parameters: [String: String], completionHandler: @escaping (Result<Data, Error>) -> Void) {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(parameters)

    let task = URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data else {
            completionHandler(.failure(error!))
            return
        }
        completionHandler(.success(data))
    }
    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

这被称为这样:

performRequest(parameters: ["foo" : "bar"]) { result in
    switch result {
    case .failure(let error):
        print(error)

    case .success(let data):
        // now use data here
    }
}

// Note: The `completionHandler` above runs asynchronously, so we
// get here before the closure is called, so don't try to do anything
// here with `data` or `error`. Any processing of those two variables
// must be put _inside_ the closure above.
Run Code Online (Sandbox Code Playgroud)

这个completionHandler闭包被定义为@escaping因为URLSession方法dataTask异步运行(即它立即返回并且它自己的闭包将在请求完成后被调用)。