Swift 将JSON解码错误传递到可操作的内容
当我在JSON中找不到任何数据时,我试图改进我的错误处理。下面的函数工作正常,没有任何问题,除非我发现了错误。我不确定如何传递错误以提示用户,或者如果Swift 将JSON解码错误传递到可操作的内容,swift,Swift,当我在JSON中找不到任何数据时,我试图改进我的错误处理。下面的函数工作正常,没有任何问题,除非我发现了错误。我不确定如何传递错误以提示用户,或者如果googlebusinessinfoisnil我可能没有数据并且传递了一个一般性错误,那么处理错误的方法是什么 以下是我的功能: func getBusinessReviews(googleUrl: String, completion: @escaping (WelcomeReview?) -> ()) { // Creat
googlebusinessinfo
isnil
我可能没有数据并且传递了一个一般性错误,那么处理错误的方法是什么
以下是我的功能:
func getBusinessReviews(googleUrl: String, completion: @escaping (WelcomeReview?) -> ()) {
// Create URL
let url = URL(string: googleUrl)
guard let requestUrl = url else { fatalError() }
// Create URL Request
var request = URLRequest(url: requestUrl)
// Specify HTTP Method to use
request.httpMethod = "GET"
//Set HTTP Header
// Send HTTP Request
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// Specify HTTP Method to use
request.httpMethod = "GET"
print("(Google)Do we have any data: \(String(describing: data))")
// Check if Error took place
if let error = error {
print("Error took place \(error)")
return
}
// Read HTTP Response Status code
if let response = response as? HTTPURLResponse {
print("(Google)Response HTTP Status code: \(response.statusCode)")
}
// Convert HTTP Response Data to a simple String
if let data = data, let dataString = String(data: data, encoding: .utf8) {
print("Googledata Response data string:\n \(dataString)")
}
if let googlebusinessdata = data {
do {
let googlebusinessinfo = try JSONDecoder().decode(WelcomeReview.self, from: googlebusinessdata)
print("googledata \(googlebusinessinfo)")
completion(googlebusinessinfo)
} catch
{
print("googledata error \(error.localizedDescription)")
let googebusinessinfoerror = error.localizedDescription
}
}
}
task.resume()
}
首先,如果在
解码
捕获块中打印error
而不是error.localizedDescription
,则可以极大地改进错误处理。前者显示了真正的错误,后者则是毫无意义的一般信息
要回答您的问题,请使用通用的结果
类型
func getBusinessReviews(googleUrl: String, completion: @escaping (Result<WelcomeReview,Error>) -> ()) {
// Create URL
let url = URL(string: googleUrl)
guard let requestUrl = url else { fatalError() }
// Create URL Request
var request = URLRequest(url: requestUrl)
// Specify HTTP Method to use
request.httpMethod = "GET"
//Set HTTP Header
// Send HTTP Request
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// Specify HTTP Method to use
request.httpMethod = "GET"
print("(Google)Do we have any data: \(String(describing: data))")
// Check if Error took place
if let error = error {
print("Error took place \(error)")
completion(.failure(error))
return
}
// Read HTTP Response Status code
if let response = response as? HTTPURLResponse {
print("(Google)Response HTTP Status code: \(response.statusCode)")
}
// Convert HTTP Response Data to a simple String
if let data = data, let dataString = String(data: data, encoding: .utf8) {
print("Googledata Response data string:\n \(dataString)")
do {
let googlebusinessinfo = try JSONDecoder().decode(WelcomeReview.self, from: data)
print("googledata \(googlebusinessinfo)")
completion(.success(googlebusinessinfo))
} catch
{
print("googledata error:", error)
let googebusinessinfoerror = error.localizedDescription
completion(.failure(error))
}
}
}
task.resume()
}
谢谢@vadian,我真的很感谢你的提示和帮助。当我使用
.success
和.failure
时,我得到一个错误,无法根据成员“success\failure”推断上下文基础。我需要在某个地方建立这个吗?您是否也更改了完成处理程序的类型(Result)->()
?啊,就是这样!再次感谢你!
getBusinessReviews(googleUrl: "Foo") { result in
switch result {
case .success(let info): print(info)
case .failure(let error): print(error)
}
}