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

Swift 4中如何更新Decodable结构体的特定id值?

嗨,我来帮你搞定这个问题~

首先得说清楚核心问题:你定义的Export结构体里所有属性都是用let声明的,这意味着这些属性是不可变的,再加上Swift的结构体是值类型,所以你没法直接修改现有实例的id值。下面给你两种可行的解决方案:

方案一:把结构体属性改为可变(推荐如果需要频繁修改的话)

直接把id的let改成var,这样就能直接修改属性了:

struct Export: Decodable {
    var id: String  // 改为var,允许修改
    let name: String
    let exportType: String
}

之后你就可以找到数组中对应要更新的实例,直接修改它的id:

// 假设你已经解析出新的id为newId
if let targetIndex = self.Exp.firstIndex(where: { $0.id == "你要匹配的旧id" }) {
    self.Exp[targetIndex].id = newId
}

这里的"你要匹配的旧id"是指你要更新的那个Export实例原来的id,用来定位它在数组中的位置。

方案二:保持结构体不可变,创建新实例替换旧的

如果你想保持结构体的不可变性(比如遵循值类型的不可变设计原则),可以给结构体加一个方法,用来生成修改id后的新实例:

struct Export: Decodable {
    let id: String
    let name: String
    let exportType: String
    
    // 生成替换id后的新实例
    func updated(withNewId newId: String) -> Export {
        return Export(id: newId, name: self.name, exportType: self.exportType)
    }
}

然后更新数组中的元素:

if let targetIndex = self.Exp.firstIndex(where: { $0.id == "你要匹配的旧id" }) {
    self.Exp[targetIndex] = self.Exp[targetIndex].updated(withNewId: newId)
}

两种方案都能解决你的问题,选哪种取决于你是否需要保持结构体的不可变性~

内容的提问来源于stack exchange,提问作者Mika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:21:36