РЕДАКТИРОВАТЬ: РЕШЕНИЕ
Благодаря ответу @LeoDabus ниже - чтобы мой код работал, я изменил свое объявление ImageKey следующим образом:
extension Image {
enum ImageKey: String, CodingKey {
case width = "Width"
case height = "Height"
case url = "Url"
}
}
ОРИГИНАЛЬНЫЙ ВОПРОС
Я пытаюсь реализовать Декодируемую структуру, Изображение.Изображение очень простое, оно выглядит так:
struct Image : Decodable {
let width: CGFloat
let height: CGFloat
let url: String
}
Конечно, когда я пытался проанализировать json, я получил, что переменные-члены не были установлены.Поэтому я продолжил расследование и обнаружил, что мой декодер всегда имеет нулевые ключи.Вот ключи, которые я использовал:
enum ImageKey: String, CodingKey {
case width = "width"
case height = "height"
case url = "url"
}
Я пробовал ключи без явного создания, например:
enum ImageKey: String, CodingKey {
case width
case height
case url
}
те же результаты.
Вот мойinit из декодера:
init(from decoder: Decoder) throws
{
let container = try decoder.container(keyedBy: ImageKey.self)
width = try container.decodeIfPresent(CGFloat.self, forKey: .width) ?? 0.0
height = try container.decodeIfPresent(CGFloat.self, forKey: .height) ?? 0.0
url = try container.decodeIfPresent(String.self, forKey: .url) ?? ""
}
Когда я ставлю точку останова в методе init и проверяю контейнер, он выглядит следующим образом:
Мне кажется, что контейнер должен иметь ключи (width, height, url), но его нет, и это было бы вероятной причиной, по которой декодер ничего не находит.
Вот пример json, с которым я тестирую,Мне интересно, помогает ли капитализация / мешает:
{
"Width": 800,
"Height": 590,
"Url": "https://obfuscated.image.url/image.jpg"
}
Кто-нибудь видел это?Знает, почему в контейнере нет ключей?
Спасибо за чтение и, как всегда, за любую помощь всегда будем благодарны.