Я работаю с внутренним разработчиком, который любит инкапсулировать тела json в другой объект, такой как данные:
Пример:
ПОЛУЧИТЬ: / пользователь / текущий:
{
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
}
Таким образом, я могу передать целевой декодируемый класс вместе с ключом, который инкапсулирует этот объект.