KeyedDecodingContainer всегда имеет нулевые ключи - PullRequest
0 голосов
/ 07 июня 2018

РЕДАКТИРОВАТЬ: РЕШЕНИЕ

Благодаря ответу @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 и проверяю контейнер, он выглядит следующим образом:

inspecting container

Мне кажется, что контейнер должен иметь ключи (width, height, url), но его нет, и это было бы вероятной причиной, по которой декодер ничего не находит.

Вот пример json, с которым я тестирую,Мне интересно, помогает ли капитализация / мешает:

{
    "Width": 800,
    "Height": 590,
    "Url": "https://obfuscated.image.url/image.jpg"
}

Кто-нибудь видел это?Знает, почему в контейнере нет ключей?

Спасибо за чтение и, как всегда, за любую помощь всегда будем благодарны.

...