2016-11-13 63 views
0

我有一個結構,我Swift應用:如何從基於Swift中元素ID的結構數組中刪除struct元素?

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

請檢查我的答案,並讓我知道它是否有效:) – KrishnaCA

+0

這聽起來像你應該使用一套。 – Paulw11

回答

1

從數組中刪除特定元素,你應該首先獲得該元素的索引,然後刪除,如下圖所示:

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

隨意建議編輯,使其更好:)

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

這是怎麼回事?

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

第一部分只有當它不在數組中時才加上temp。 最後一行刪除標記爲已刪除的所有元素。

1

首先,我建議您修復類:

  • 可選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))