swift相关

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
    }
}

还有其他的方法可以做数组同时遍历删除,就不一一介绍了。

上一篇下一篇

猜你喜欢

热点阅读