如何根据Swift中元素的id从结构数组中删除struct元素?

时间:2016-11-13 19:07:28

标签: ios swift nsarray

我的Swift应用中有一个结构:

open class Cluster : NSObject {

    open var username: String? = ""
    open var id: String? = ""
    open var deleted: Bool? = false

}

现在我正在迭代这个数组,我正在为它添加新元素,但只有在那些元素还没有的情况下:

if(!self.array.contains(where: {$0.id==temp.id}))
     {
        self.array.append(temp);
     }

我想调整这段代码,这样它不仅可以添加新元素(如果它们不存在),还会删除那些 - 同时 - 将其标志deleted更改为true。

我开始编写这段代码:

if(!self.array.contains(where: {$0.id==temp.id}))
    {
        self.array.append(temp);
    } else {
        if(temp.deleted == true){
            self.array.remove //how can I remove here this specific element?
    }
}

4 个答案:

答案 0 :(得分:3)

要从数组中删除特定元素,您应首先获取该元素的索引,然后删除,如下所示:

if let index:Int = self.array.index(where: {$0.id == temp.id && $0.deleted == true}) {
    self.array.remove(at: index)
}

答案 1 :(得分:2)

首先,我建议你修复你的课程:

  • 可选Bool毫无意义 - 该对象已被删除
  • 可选的id也没有多大意义;所有对象都需要id
  • 如果您实现NSObject的哈希和相等部分,那么您可以访问数组的index(of:)方法,并且可以使用集合。

<强> Cluster.swift

open class Cluster : NSObject {

    open var username: String? = ""
    open let id: String
    open var isDeleted: Bool = false

    init(id: String) {
        self.id = id
    }

    open override var hashValue: Int {
        get {
            return self.id.hashValue
        }
    }

    open override func isEqual(_ object: Any?) -> Bool {
        guard let rhs = object as? Cluster else {
            return false
        }

        let lhs = self

        return lhs.id == rhs.id
    }  
}

现在,给定一组Cluster个对象,您可以使用以下命令删除已删除的对象:

let cleanArray = dirtyArrayOfCluster.filter {
    !$0.isDeleted
}

您可以通过将数组传递给集合来删除重复项:

let deDupedArray = Array(Set(cleanArray))

答案 2 :(得分:0)

if temp.deleted == true, let index = array.index(where: { $0.id == temp.id }) {
    array.remove(at: index)
}

答案 3 :(得分:0)

这个怎么样?

if array.contains(where: { $0.id == temp.id  } ) {
    array.append(temp)
}
array = array.filter { $0.deleted == true }

第一部分只有在不在数组中时才添加temp。 最后一行删除标记为已删除的所有元素。