我的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?
}
}
答案 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
。
最后一行删除标记为已删除的所有元素。