Swift中Codable模型解码后无法修改新增属性的问题
问题根源
你遇到的问题是结构体的值类型特性导致的:在for var event in decodedResponse循环里,event是原数组元素的副本,修改副本的属性不会影响原数组中的元素,所以循环结束后原数组里的swiftDate和groupIndex仍保持初始值。
解决方案
方案1:通过数组索引直接修改原元素
直接操作数组的索引位置,修改的是原数组中的结构体实例,而非副本:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yy-MM-dd HH:mm:ss" for index in decodedResponse.indices { decodedResponse[index].swiftDate = dateFormatter.date(from: "2023-10-05 16:00:00") ?? Date() decodedResponse[index].groupIndex = 1 }
方案2:使用map生成新数组
遍历原数组,创建每个元素的可变副本并修改,最后用修改后的副本组成新数组替换原数组:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yy-MM-dd HH:mm:ss" decodedResponse = decodedResponse.map { event in var mutableEvent = event mutableEvent.swiftDate = dateFormatter.date(from: "2023-10-05 16:00:00") ?? Date() mutableEvent.groupIndex = 1 return mutableEvent }
模型优化建议
如果不想给新增属性设置默认值,可以自定义解码初始化方法,手动控制属性初始化逻辑,同时符合Decodable协议:
typealias AModel = [AModelElement] struct AModelElement: Codable, Identifiable { let id = UUID() let idEvent: Int let creationDate: String var swiftDate: Date var groupIndex: Int enum CodingKeys: String, CodingKey { case idEvent case creationDate = "CreationDate" } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) idEvent = try container.decode(Int.self, forKey: .idEvent) creationDate = try container.decode(String.self, forKey: .creationDate) // 自定义新增属性的初始值 swiftDate = Date() groupIndex = 0 } }
内容的提问来源于stack exchange,提问作者Saamer
相关产品推荐
相关产品推荐

