Сначала вам нужно struct
в соответствии с Codable
, соответствующим вашему json
struct Person: Codable {
var name: String
var age: Int
var pets: [String]
}
, затем вы можете использовать этот универсальный метод, который принимает объект в типе Data
, декодирует его и изменяет его так, как выобъявить позже в changeBlock
закрытие.Затем он кодирует его обратно
extension Data {
mutating func update<T: Codable>(changeBlock: (inout T) -> Void) throws {
var decoded = try JSONDecoder().decode(T.self, from: self)
changeBlock(&decoded)
self = try JSONEncoder().encode(decoded)
}
}
Использование:
do {
try data.update { (person: inout Person) -> Void in
person.pets[0] = "cat"
}
} catch { print(error) }
//print(String(data: data, encoding: .utf8))