KeyPath与Codable序列化的深度联动:动态属性提取与映射
结合Swift KeyPath与KeyPath Coding Key,实现动态JSON提取、属性映射、自动转换和部分更新,超越简单的Codable。 · 难度:入门 · +10XP
KeyPath与Codable序列化的深度联动:动态属性提取与映射
多数人使用Codable只满足于自动合成。本教程将展示如何利用KeyPath(包括WritableKeyPath)进行动态编解码:根据运行时路径读取/写入属性,实现部分JSON更新(Partial Update)、属性名称映射、嵌套路径扁平化。还将涉及CustomCodingKey与JSONDecoder的userInfo结合KeyPath的高级技巧。
struct User: Codable {
var id: Int; var name: String
}
func decodePartial<T: Decodable, V>(from data: Data, keyPath: KeyPath<T, V>) -> V? {
guard let container = try? JSONDecoder().decode(T.self, from: data) else { return nil }
return container[keyPath: keyPath]
}
let json = """{"id":1,"name":"Alice"}""".data(using: .utf8)!
if let name = decodePartial(from: json, keyPath: \User.name) {
print(name) // Alice
}