Как называется кейс для маппинга имён в Foundation?
Что проверяют
Ответ короткий: CodingKeys, вложенный enum, который связывает свойства модели с ключами во внешних данных. Интервьюеру важно, отличаете ли вы механизм (Codable и протокол CodingKey) от инструмента (JSONDecoder). Следом спрашивают про keyDecodingStrategy и про ключи во вложенных объектах.
Как отвечать
Если имена свойств совпадают с ключами JSON, компилятор сам синтезирует CodingKeys для типа с Codable. Когда не совпадают, enum объявляют вручную: enum CodingKeys: String, CodingKey { case id; case userName = "user_name" }.
Что важно знать:
- сырое значение кейса: это ключ во внешних данных, а имя кейса обязано совпадать с именем свойства;
- исключение полей: свойство, которого нет в
CodingKeys, не кодируется и не декодируется. Для синтезированногоDecodableу него должно быть значение по умолчанию, иначе тип не скомпилируется; - стратегии декодера:
decoder.keyDecodingStrategy = .convertFromSnakeCaseпревращаетuser_nameвuserNameдля всей модели сразу, уJSONEncoderесть парная.convertToSnakeCase, для нестандартных правил есть.custom; - вложенные ключи: если значение лежит внутри объекта
profile, а модель плоская, пишут свойinit(from:)и достают поле черезnestedContainer(keyedBy:forKey:).
Сам JSONDecoder про имена ничего не решает, он исполняет то, что описано в CodingKeys и выбранной стратегии. Поэтому один и тот же тип одинаково работает и с JSONDecoder, и с PropertyListDecoder.
Где спотыкаются
Называют JSONDecoder или Codable вместо CodingKeys. Это соседние понятия, а вопрос именно про перечисление с ключами.
Совмещают .convertFromSnakeCase с кейсами вида case userName = "user_name". Стратегия сначала переводит ключи из JSON в camelCase и только потом ищет совпадение, поэтому "user_name" уже ничему не соответствует. При включённой стратегии сырые значения пишут в camelCase или не пишут вовсе.
Забывают про аббревиатуры: image_url после конвертации станет imageUrl, и свойство imageURL без явного кейса case imageURL = "imageUrl" останется пустым, а декодирование упадёт с keyNotFound.