You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:46:09