我正在尝试了解对API的请求。我正在使用新闻API进行测试。我有两个结构和一个WebService函数。
我不知道这里可能出了什么问题,因为我正在遵循一个教程来学习这一点,并且正在做老师教我做的事情。
结构:
import Foundation
struct ArticleList: Decodable {
let status: String
let articles: [Article]
}
struct Article: Decodable { // Decodable because we only read, we do not send anything with this struct
let title: String
let description: String
}
这是WebService:
import Foundation
class Webservice {
func getArticles(url: URL, completion: @escaping ([Article]?) -> ()) {
print("URL: (url)")
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print(error.localizedDescription)
completion(nil)
} else if let data = data {
let articleList = try? JSONDecoder().decode(ArticleList.self, from: data)
if let articleList = articleList {
completion(articleList.articles)
}
print(articleList?.articles)
}
}.resume()
}
}
WebService类中的最后一个打印是打印nil
,尽管我正在使用Newsneneneba API链接:https://newsapi.org/v2/top-headlines?country=us&apiKey=XX
,是的,我正在使用apiKey而不是XX,当我访问该链接时,我会得到json,所以这应该不是问题。
我在这里做错了什么?
永远不要使用
try?
它忽略错误,使用
do{
//Your code here
}catch{
print(error)
}
CodingKeys(stringValue: "description", intValue: nil)], debugDescription: "Expected String value but found null instead.", underlyingError: nil))
告诉您,它发现了null
,因此。。。
将let description: String
更改为let description: String?
为了使其可选,API将不总是具有description
的值。
错误应该总是优雅地处理。您应该确定通往throw
的方法,或者返回一个带有failure
的Result
。
如果出现问题,应告知用户。