想象一下,我有一个Data
格式的json
var data = Data("""
{
"name": "Steve",
"age": 30,
"pets": [
"dog"
]
}
""".utf8)
如何在保持pets
变量不变的情况下,将"cat"
的第一个元素更改为data
?
答案 0 :(得分:2)
首先,您需要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))