[英]Swift: Escaping closure captures non-escaping parameter '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()
}
}
用這個:
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()
}
}
這是由於您的參數 onCompletion 而發生的。 默認情況下它是@nonesacping,您必須將其標記為@esacping,以便它可以在completionHandler 閉包中工作。
func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)
這里的答案是在完成處理程序參數聲明之前添加 @escaping 是正確的,盡管簡短地解釋了。
這是我從Swift 的文檔中獲取的完整圖片所缺少 的內容:
轉義閉包
當閉包作為參數傳遞給函數時,閉包被稱為對函數進行轉義,但在函數返回后被調用。 當您聲明一個將閉包作為其參數之一的函數時,您可以在參數類型前寫上@escaping 以指示允許閉包轉義。
所以基本上,如果你想在方法返回后調用一個完成處理程序,它被定義為 swift 中的escaping
,並且應該這樣聲明:
func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.