swift-数组同时遍历删除
2021-05-31 本文已影响0人
mrkison
swift中有多种遍历删除的方法,下面对几种常用的分析。
一、测试数据
class ObjModel: NSObject {
var name: String = "name1"
var age: Int = 0
var sex: Bool = false
init(name: String, age: Int, sex: Bool) {
self.name = name
self.age = age
self.sex = sex
}
}
let objModel1 = ObjModel(name: "name1", age: 1, sex: true)
let objModel2 = ObjModel(name: "name2", age: 2, sex: false)
let objModel3 = ObjModel(name: "name3", age: 2, sex: true)
let objModel4 = ObjModel(name: "name4", age: 4, sex: false)
var objArr = [objModel1, objModel2, objModel3, objModel4]
二、遍历
第一种
for (idx, model) in objArr.enumerated() {
if model.age == 2 {
objArr.remove(at: idx)
}
}
//打印
//名字:name1 年龄:1 性别:true
//名字:name2 年龄:2 性别:true
看出来这里删除位置是错误的,我们希望的应该是剩下name1、name4,因为删除后索引会变所以会出现删除错误,并且如果需要删除的模型在数组最后,会出现数组越界
。需要reversed()
加上数组倒序
for (idx, model) in objArr.enumerated().reversed() {
if model.age == 2 {
objArr.remove(at: idx)
}
}
//打印
//名字:name1 年龄:1 性别:true
//名字:name3 年龄:4 性别:false
第二种:可以用removeAll
闭包
objArr.removeAll { (model) -> Bool in
if model.age == 2 {
//true 是要移除的
return true
}else {
return false
}
}
//简便写法
objArr.removeAll { $0.age == 2 }
第三种:用filter
筛选
objArr = objArr.filter { (model) -> Bool in
if model.age == 2 {
//fase 是不要
return false
}else {
return true
}
}
还有其他的方法可以做数组同时遍历删除,就不一一介绍了。