У меня есть тип Codable, скажем, Car
, который определяется как:
struct Car: Codable {
let age: Int
let color: String
}
Я могу кодировать / декодировать это просто отлично.
С моей системой персистентности, когда объект сохраняется, ему присваивается свойство _id
, которое является String
, например. 5cae04b533376609456d40ed
.
Таким образом, когда я читаю Data
из постоянного хранилища и затем пытаюсь декодировать его, в нем появляются дополнительные байты, которые представляют свойство _id
и связанное с ним значение String
.
Я не контролирую различные типы, которые могут быть закодированы и сохранены в магазине. Единственное ограничение на них заключается в том, что они Codable
.
То, что я хочу сделать, это декодировать Data
, который я получаю при чтении из магазина (с включенным материалом _id
), в тип, похожий на Wrapped<T: Codable>
, который будет определяться как что-то вроде (в простейшем виде):
struct Wrapped<T: Codable> {
let _id: String
let value: T
}
Однако я не уверен, что буду об этом.
Одна попытка, которую я предпринял, состояла в том, чтобы определить пользовательскую функцию decode
, но это не зашло слишком далеко, поскольку я не могу получить доступ к CodingKeys
типа T
, который делает вещи настолько, насколько я могу сказать, что невозможно при таком подходе.
Может быть, есть другой подход, который заставил бы все работать так, как мне хотелось бы?