如何解决Swift 5 URLSession API 类抛出奇怪的错误
立即使用 SwiftUI 学习 Swift。我正在尝试构建一个处理 API 的类,但有很多困难。
所以我有一个股票价格函数,我想在有人加载视图时从这个 API 调用它,然后我希望这个函数返回正确的股票价格对象列表,以便我可以将它呈现到图表中。
>出于某种原因,我遇到了 Result 没有 .success 函数的问题。
很想知道这里的想法!
这是我现在的代码:
final class StockAPI{
func fetchData(symbol: String,completion: @escaping (Result) -> Void) {
let url = URL(string: "https://google.com")!
var request = URLRequest(url: url)
request.setValue("application/json",forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let json: [String: Any] = ["symbol": symbol]
let jsonData = try? JSONSerialization.data(withJSONObject: json)
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request,completionHandler: { (data,response,error) in
if let error = error {
//completion(.error(error.localizedDescription as! Error),error)
return
}
do{
let stockPrices = try? JSONDecoder().decode([StockPrice].self,from: data!)
DispatchQueue.main.async {
// update our UI
print("Dispatching request")
completion(.success(from: stockPrices as! Decoder))
}
} catch let jsonError {
return
}
})
task.resume()
}
解决方法
在您的两个错误情况(网络错误和解析错误)中,您应该使用 .failure
和错误调用完成闭包。现在你正在盲目飞行。
Result
的使用很奇怪,因为它是一个泛型,通常采用 Result<[StockPrice],Error
> 的形式(即指定成功类型是什么,即 [StockPrice]
,以及失败类型是什么,即Error
)。结果是一个泛型,您想指定 .success
和 .failure
的关联类型是什么类型。
所以,它可能是这样的:
func fetchData(symbol: String,completion: @escaping (Result<[StockPrice],Error>) -> Void) { // if you have compilation error here,try `Swift.Result<[StockPrice],Error>` instead
let url = URL(string: "https://google.com")!
var request = URLRequest(url: url)
request.setValue("application/json",forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let object = ["symbol": symbol]
request.httpBody = try! JSONEncoder().encode(object) // or wrap this in `do`-`catch` block and use `try` without the `!`
let task = URLSession.shared.dataTask(with: request) { data,response,error in
if let error = error {
completion(.failure(error))
return
}
do {
let stockPrices = try JSONDecoder().decode([StockPrice].self,from: data!)
DispatchQueue.main.async {
// update our UI
print("Dispatching request")
completion(.success(stockPrices))
}
} catch let jsonError {
completion(.failure(jsonError))
}
}
task.resume()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。