Swift 4 Не декодировать JSON необязательно должным образом
Свифт нуб здесь.
Я пытаюсь следить за разработкой приложений с помощью книги Swift и столкнулся с проблемами при декодировании данных JSON из API NASA, как показано в примерах. Вот код, который я пытаюсь использовать:
struct PhotoInfo: Codable {
var title: String
var description: String
var url: URL
var copyright: String?
enum CodingKeys: String, CodingKey {
case title
case description = "explanation"
case url
case copyright
}
init(from decoder: Decoder) throws {
let valueContainer = try decoder.container(keyedBy: CodingKeys.self)
self.title = try valueContainer.decode(String.self, forKey: CodingKeys.title)
self.description = try valueContainer.decode(String.self, forKey: CodingKeys.description)
self.url = try valueContainer.decode(URL.self, forKey: CodingKeys.url)
self.copyright = try valueContainer.decode(String.self, forKey: CodingKeys.copyright)
}
}
func fetchPhotoInfo(completion: @escaping (PhotoInfo?) -> Void) {
let baseURL = URL(string: "https:/
let query: [String: String] = [
"api_key": "yN3**0scRWo12gCa25TWBcfp3rcuAnoeqwbpvLPn",
"date": "2011-07-13"
]
let url = baseURL.withQueries(query)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
let jsonDecoder = JSONDecoder()
if let data = data,
let photoInfo = try? jsonDecoder.decode(PhotoInfo.self, from: data) {
print(data)
completion(photoInfo)
} else {
print("Either no data was returned, or data was not properly decoded.")
completion(nil)
}
}
task.resume()
}
Когда я удаляю код авторского права из структуры PhotoInfo, он декодирует JSON и печатает данные (строка 36). Иначе, это не десериализует это. Есть ли способ, которым я могу решить, почему это происходит? Это как-то связано с дополнительным?
2 ответа
Если авторское право не является обязательным, то вы можете использовать decodeIfPresent
,
self.copyright = try valueContainer.decodeIfPresent(String.self, forKey: CodingKeys.copyright)
РЕДАКТИРОВАТЬ: Обновлено за комментарии @ Matt.
Ответ Technerd, вероятно, лучший, но я столкнулся с той же проблемой и решил ее, изменив try
в try?
, Во всяком случае, так было представлено в предыдущих упражнениях. Однако, как указывает @matt, это не означает, что информация об авторских правах не просто отсутствует, а фактически отличается от того, что ожидалось. С помощью try?
в тандеме с if let
Заявление обеспечивает хотя бы базовую обратную связь.