Я работаю с бэкэнд-разработчиком, который любит инкапсулировать тела json в другой объект, такой как данные:
Пример:
GET: / пользователь / текущий:
{
data: {
firstName: "Evan",
lastName: "Stoddard"
}
}
Я просто хотел бы просто вызвать json decode для ответа, чтобы получить созданную мной структуру User, но для добавленного объекта данных требуется другая структура. Чтобы обойти это, я создал шаблон общего класса:
struct DecodableData<DecodableType:Decodable>:Decodable {
var data:DecodableType
}
Теперь я могу получить полезную нагрузку json и, если я хочу получить структуру User, просто получить свойство data моего шаблона:
let user = JSONDecoder().decode(DecodableData<User>.self, from: jsonData).data
Это все прекрасно и прекрасно, пока иногда ключ data
не всегда data
.
Мне кажется, что это, скорее всего, довольно тривиальные вещи, но есть ли способ добавить параметр в определение шаблона, чтобы я мог изменить ключи кодирования перечисления, так как этот ключ данных может измениться?
Что-то вроде следующего?
struct DecodableData<DecodableType:Decodable, Key:String>:Decodable {
enum CodingKeys: String, CodingKey {
case data = Key
}
var data:DecodableType
}
Таким образом, я могу передать целевой декодируемый класс вместе с ключом, который инкапсулирует этот объект.