【发布时间】:2021-02-20 03:26:09
【问题描述】:
import Foundation
import Combine
let liveSample = URL(string: "https://newsapi.org/v2/top-headlines?country=us&apiKey=<api key>")!
struct ArticleList: Codable {
struct Article: Codable {
struct Source: Codable {
var id: String?
var name: String?
}
var source: Source?
var author: String?
var title: String?
var description: String?
var url: URL?
var urlToImage: URL?
var publishedAt: Date?
var content: String?
}
var status: String
var totalResults: Int
var articles: [Article]
}
struct Resource<T: Codable> {
let request: URLRequest
}
extension URLSession {
func fetchJSON<T: Codable>(for resource: Resource<T>) -> AnyPublisher<T, Error> {
return dataTaskPublisher(for: resource.request)
.map { $0.data }
.decode(type: T.self, decoder: JSONDecoder())
.eraseToAnyPublisher()
}
}
var subscriber: AnyCancellable?
var resource: Resource<ArticleList> =
Resource<ArticleList>(request: URLRequest(url: liveSample))
subscriber?.cancel()
subscriber = URLSession.shared.fetchJSON(for: resource)
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("The publisher finished normally.")
case .failure(let error):
print("An error occured: \(error).")
}
}, receiveValue: { result in
dump(result)
})
我正在使用 Xcode 12 RC 生成错误:
发生错误:typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "articles", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys (stringValue: "publishedAt", intValue: nil)], debugDescription: "期望解码 Double 但找到了一个字符串/数据。",underlyingError: nil))。
【问题讨论】:
-
请仔细阅读错误信息。这很清楚。键
articles的数组中键publishedAt的值是一个字符串。要将值解码为Date,您必须添加.iso8601日期解码策略。默认日期解码策略需要TimeInterval(又名Double)。
标签: json swift codable swift-playground