我試圖使用JSONDecoder
來解碼從我的服務器使用Alamofire json響應。當我用guard
解碼響應時,它沒有任何問題。這種方法的副作用是我無法分辨解碼實際上失敗時的問題。捕獲模式更改回調簽名
guard let result: TResponseData = try? decoder.decode(TResponseData.self, from: response.data!) else {
self.logger.error("Unable to decode the response data into a model representation.")
return
}
所以不是我想要用do { } catch { }
,但我想不出我應該如何準確的Alamofire responseJSON
回調中使用它。
這就是我目前有:
Alamofire.request(completeUrl, method: .post, parameters: parameters, encoding: encoding, headers: headers)
.validate()
.responseJSON { (response) -> Void in
self.logger.info("POST Response: \(String(describing:response.response?.statusCode))")
switch response.result {
case .success(_):
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom(Date.toTMDBDate)
do {
let _ = try decoder.decode(TResponseData.self, from: response.data!)
} catch DecodingError.dataCorrupted(let error) {
self.logger.error(error.underlyingError)
return
}
completion(result)
return
case .failure(let error):
//....
}
我這個代碼給然而什麼是對.responseJSON { (response) -> Void in
行編譯錯誤。
將類型爲'(_) - > Void'的投擲函數轉換爲非拋出函數類型'(DataResponse) - > Void'無效轉換。
警衛代碼工作正常,如果我改變try
到try?
或強制拆開包裝,它編譯 - 我只是不明白這有我的捕捉處理實際的錯誤。
如果我更改catch
塊,以便它不包含任何模式,則代碼將進行編譯。
catch {
return
}
這並不能告訴我什麼,我的guard
給了我什麼。我真的想要捕獲decode
操作遇到的錯誤。我是否使用了錯誤的模式?爲什麼使用DecodingError.dataCorrupted
模式似乎會改變回調簽名?
真棒謝謝! –
嗨,@哈米什,你爲什麼不把這個作爲答案來寫,所以約翰遜可以將它標記爲這樣! – leanne
@leanne現在就完成了:) – Hamish