Swift:转义闭包捕获非转义参数“onCompletion”

leo*_*uis 7 api get ios swift

我的 swift 有问题。我正在尝试发送 API 请求,然后检索数据,但收到以下错误消息:

“Swift:转义闭包捕获非转义参数‘onCompletion’”。有谁知道我该如何解决这个问题?提前致谢

代码:


class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 19

您必须用@escaping. 通常编译器会提供修复

class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : @escaping (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}
Run Code Online (Sandbox Code Playgroud)


Ode*_*Dov 9

这里的答案是在完成处理程序参数声明之前添加@escaping,尽管对此进行了简短的解释。

\n

这是我所缺少的完整图片,取自Swift 的文档

\n
\n

逃离封闭

\n

当闭包作为参数传递给函数时,称为转义函数,但在函数返回后调用。当您声明一个采用闭包参数之一的函数时,您可以在参数 xe2x80x99s 类型之前编写@escaping,以指示允许闭包转义。

\n
\n

所以基本上,如果您希望在方法返回调用完成处理程序,则它的定义如escapingswift 中所示,并且应声明如下:

\n
func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)\n
Run Code Online (Sandbox Code Playgroud)\n