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
相关产品推荐
相关产品推荐

