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



我的 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()

}
}

您必须用@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()
}
}

这里的答案是正确的,在完成处理程序参数声明之前添加@escaping,尽管解释得很短。

以下是我从 Swift 文档中获取的完整图片:

转义闭包

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

所以基本上,如果你想在方法返回后调用一个完成处理程序,它在 swift 中被定义为escaping,并且应该这样声明:

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)

由于您的参数onCompletion,这很令人高兴。默认情况下,@nonesacping您必须将其标记为@esacping,以便可以在 completionHandler 闭包中工作。

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)

使用这个:

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()
}
}