如何在Swift中根据id从对象数组中删除元素?

4

我有一个对象数组,格式如下。

var arrStudents = [S1,S2,S3,S4,S5]

这里的s1是学生类的对象

class Student {

    var id:Int!
    var name:String!
    var address:String?
    var phone:Int!
}

现在我想通过学生ID从数组中删除一条记录,请告诉我如何做到这一点。

在Swift中,惯例是将类实例的名称以小写字母开头命名。顺便说一下,如果您不了解可选项的工作原理,应尽可能避免使用隐式解包可选项。您只需要为您的类提供一个自定义初始化程序或者使用结构体代替类即可,这样就不需要实现初始化程序。 - Leo Dabus
请注意,您应将电话属性定义为字符串类型。 - Leo Dabus
“我想学习所有的数组操作” - 网上有很多教程可以学习。在这里,我们处理具体的问题。 - Cristik
感谢您宝贵的反馈 @LeoDabus - TechChain
可能是根据属性从数组中删除特定对象?的重复问题。 - Cristik
可能是根据属性从数组中删除特定对象?的重复问题。 - jpp
3个回答

6
循环遍历数组的所有索引,检查是否与要删除的id匹配,如果匹配,则过滤掉该元素并删除该索引 :-)
let idToDelete = 10
if let index = arrStudents.index(where: {$0.id == idToDelete}) {
    array.remove(at: index)
}

如果你想在单次迭代中删除多个值,你应该从最后一个索引开始循环,这样就不会崩溃(越界错误)。

var idsToDelete = [10, 20]
for id in idsToDelete {
        for (i,str) in arrStudents.enumerated().reversed()
        {
            if str.id == id
            {
                arrStudents.remove(at: i)
            }
        }
    }

只回答代码是不鼓励的。顺便说一下,Swift是一种类型推断语言。不需要显式设置类型。"self"是多余的。临时对象在哪里声明? - Leo Dabus
抱歉,我还沉迷于Objective-C的self写法。谢谢您的评论 :-) - Iraniya Naynesh
index(where:)现在已经被弃用。新的方法是firstIndex(where:) - JonyMateos
index(where:) 现在已被弃用。新的方法是 firstIndex(where:) - undefined

1
第一个变量名应该用小写字母。
只需使用属性id搜索要查找的元素在数组中的索引,然后将其从学生数组中删除。
var arrStudents = [s1, s2, s3, s4, s5]


if let index = arrStudents.index(where: {$0.id == 1}) // Search id = 1 you can set any value 
{
    arrStudents.remove(at: index)
}

学习请参考以下示例:

  1. Swift中的高阶函数:Filter、Map、Reduce、flatmap
  2. Swift 3.0 中的简单高阶函数:Map、filter、reduce 和 flatMap!
  3. Swift指南:Map Filter Reduce

0
struct Stu {
        let id: Int
        let name: String
    }

    let stu1 = Stu(id: 1, name: "Tom")
    let stu2 = Stu(id: 2, name: "Jhon")

    var arrString: [Stu] = [stu1, stu2]

    //filter will give you an array with the matched value
    let matchedObjectFromArray = arrString.filter { (obj) -> Bool in
        return obj.id == 1 //return Stu object whose id = 1
    }

    //index method gives index of object if found in an array otherwise gives nil
    if let indexOfObject = arrString.index(where: { (obj) -> Bool in
        return obj.id == 2 // return index of Stu object whose id = 2
    }) {

        let removedObject = arrString.remove(at: indexOfObject)
        print(removedObject.id)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接