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