美文网首页swift相关
swift-数组同时遍历删除

swift-数组同时遍历删除

作者: mrkison | 来源:发表于2021-05-31 22:45 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:swift-数组同时遍历删除

        本文链接:https://www.haomeiwen.com/subject/ajbgsltx.html