Swift: Escaping closure captures non-escaping parameter 'onCompletion'

Posted Hunter药药

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift: Escaping closure captures non-escaping parameter 'onCompletion'相关的知识,希望对你有一定的参考价值。

遇到一个编译报错:

Escaping closure captures non-escaping parameter ‘onCompletion‘

代码如下:

func fetchRecentPhotos(completion: (PhotosResult) -> Void)
    {
        let url = recentPhotosURL()
        let request = URLRequest(url: url as URL)
        let task = session.dataTask(with: request)
        {
            (data, response, error) -> Void in
            
            let result = self.processRecentPhotosRequest(data: data as NSData?, error: error as NSError?)
            completion(result)
        }
        task.resume()
    }

 这是由于completion导致的,默认闭包completion是@nonescaping的,只需要声明成@escaping即可。

func fetchRecentPhotos(completion: @escaping (PhotosResult) -> Void)

以上是关于Swift: Escaping closure captures non-escaping parameter 'onCompletion'的主要内容,如果未能解决你的问题,请参考以下文章

Closure use of non-escaping parameter 'xxx' may allow it to escape

Swift @escaping 和完成处理程序

将闭包更新到 Swift 3 - @escaping

当完成处理程序显式使用 @escaping 时,Swift 推断完成处理程序闭包是默认的 @nonescaping 而不是 @escaping

Swift:闭包(Closures)

Swift @escaping 仅适用于非空函数参数?