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 Заявление обеспечивает хотя бы базовую обратную связь.

Другие вопросы по тегам