【发布时间】:2018-04-02 18:37:48
【问题描述】:
我正在尝试使用 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 块使其不包含任何模式,则代码将编译。
catch {
return
}
这并没有给我任何关于我的guard 给我的东西。我真的很想捕获decode 操作遇到的错误。我使用了错误的模式吗?为什么使用DecodingError.dataCorrupted 模式似乎会改变回调签名?
【问题讨论】:
-
太棒了,谢谢!
-
嘿,@Hamish,你为什么不把这个写下来作为答案,这样 Johnathon 就可以这样标记它!
-
@leanne 现在刚刚完成 :)
标签: swift swift4 decodable do-catch