关于swift遍历删除更新元素的bug

最近做项目的时候,有个场景是存储用户调整过的频道数据,当再次进来的如果后台对数据有删除或者更新,那就对本地数据进行调整。

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)
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容