最近做项目的时候,有个场景是存储用户调整过的频道数据,当再次进来的如果后台对数据有删除或者更新,那就对本地数据进行调整。
struct model {
var id :String
var value :String
init(_ id:String,_ value:String) {
self.id = id
self.value = value
}
}
举例数据
var channels:[model] = [model("1", "1"),model("2", "2"),model("3", "3"),model("4", "4"),model("5", "5"),]
let tempChannels :[model] = [model("1", "1.2"),model("3", "3.2"),model("5", "5.2"),]
原来的写法是
channels.enumerated().forEach{ (index,oldChannel) in
let isMore = tempChannels.filter{$0.id == oldChannel.id}
if let newData = isMore.first {
channels[index] = newData
}else{
channels.remove(at: index)
}
}
这样子的写法,当靠前的一个数据被删除后,数组后面再次更新或者删除一个数据,获取的index就不准确了,更新数据就会出错甚至越界崩溃
如果是以前的做法,重新获取下标index是能解决问题的
channels.enumerated().forEach{ (oldChannel) in
let isMore = tempChannels.filter{$0.id == oldChannel.id}
guard let index = channels.firstIndex(of:oldChannel) else {return}
if let newData = isMore.first {
channels[index] = newData
}else{
channels.remove(at: index)
}
}
其实,这里最简单的完美做法就是把数据倒序,最小的修改
channels.enumerated().reversed().forEach{ (index,oldChannel) in
let isMore = tempChannels.filter{$0.id == oldChannel.id}
if let newData = isMore.first {
channels[index] = newData
}else{
channels.remove(at: index)
}
}