最近做項目的時候描滔,有個場景是存儲用戶調(diào)整過的頻道數(shù)據(jù),當(dāng)再次進(jìn)來的如果后臺對數(shù)據(jù)有刪除或者更新宴偿,那就對本地數(shù)據(jù)進(jìn)行調(diào)整。
struct model {
var id :String
var value :String
init(_ id:String,_ value:String) {
self.id = id
self.value = value
}
}
舉例數(shù)據(jù)
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)
}
}
這樣子的寫法诀豁,當(dāng)靠前的一個數(shù)據(jù)被刪除后窄刘,數(shù)組后面再次更新或者刪除一個數(shù)據(jù),獲取的index就不準(zhǔn)確了舷胜,更新數(shù)據(jù)就會出錯甚至越界崩潰
如果是以前的做法娩践,重新獲取下標(biāo)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)
}
}
其實,這里最簡單的完美做法就是把數(shù)據(jù)倒序逞带,最小的修改
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)
}
}