2016-09-03 12 views
6

オブジェクト:削除重複私は次のように定義されたカスタムクラスを持っているスウィフト

class DisplayMessage : NSObject { 
var id : String? 
var partner_image : UIImage? 
var partner_name : String? 
var last_message : String? 
var date : NSDate? 
} 

今、私は配列myChats = [DisplayMessage]?を持っています。 idフィールドは、DisplayMessageオブジェクトごとに一意です。私は自分のアレイをチェックし、その中のすべての複製を削除する必要があります。アレイ内のすべてのオブジェクトに固有のidがあることを確認してください。私はNSMutableArrayEquatableを使っていくつかの解決策を見てきましたが、ここでそれらをどのように適応させるかはわかりません。私もArray(Set(myChats))を知っていますが、それはカスタムオブジェクトの配列では機能しないようです。

+0

はこれをチェック/ questions/34709066/remove-duplicate-objects-in-an-array –

答えて

4

あなたは文字列のセットでそれを行うことができ、このように:

var seen = Set<String>() 
var unique = [DisplayMessage] 
for message in messagesWithDuplicates { 
    if !seen.contains(message.id!) { 
     unique.append(message) 
     seen.insert(message.id!) 
    } 
} 

アイデアは、ループ内のすべての項目を通過し、我々がこれまで見てきたすべてのIDのセットを維持することです、私たちが見たことのないIDを追加します。ここで

+0

辞書を使うともっと簡単にできますか? –

6

は、指定されたキーに基づいてオブジェクトのユニークなリストを返すために、アレイの拡張機能である:

extension Array { 
    func unique<T:Hashable>(map: ((Element) -> (T))) -> [Element] { 
     var set = Set<T>() //the unique list kept in a Set for fast retrieval 
     var arrayOrdered = [Element]() //keeping the unique list of elements but ordered 
     for value in self { 
      if !set.contains(map(value)) { 
       set.insert(map(value)) 
       arrayOrdered.append(value) 
      } 
     } 

     return arrayOrdered 
    } 
} 

あなたの例のために行います。http://stackoverflow.com

let uniqueMessages = messages.unique{$0.id ?? ""} 
関連する問題