Прежде всего, почему ваша структура соответствует Decodable
, хотя вы вообще не используете JSONDecoder
?
Вы делаете общую ошибку, вы игнорируете корневой объект.Вам нужно две структуры, и, пожалуйста, назовите Article
в единственном числе.
struct Root : Decodable {
let status : String
let totalResults : Int?
let message : String? // message is used in case of an error
let articles : [Article]?
}
struct Article : Decodable {
let author : String?
let content : String?
let description : String
let publishedAt : Date
let title : String
let url : URL
let urlToImage : URL?
}
Инициализатор и статическая функция в Article
не нужны.
В fetchDataWithAlamofire()
используйте responseData
вместо responseJSON
и декодировать JSON с помощью JSONDecoder
.
url
и urlToImage
можно декодировать непосредственно в URL
, а publishedAt
можно декодировать в Date
func fetchDataWithAlamofire() {
guard let url = URL(string: api_url) else { return }
request(url).validate().responseData { dataResponse in
switch dataResponse.result {
case .success(let data):
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let result = try decoder.decode(Root.self, from: data)
self.articles = result.articles
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print(error)
}
case .failure(let error):
print(error)
}
}
}