2016-09-03 36 views
6

Mam niestandardowej klasy zdefiniowane następująco:Usuwanie duplikatów z tablicy obiektów niestandardowych Swift

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

Teraz mam tablicę myChats = [DisplayMessage]?. Pole id jest unikalne dla każdego obiektu DisplayMessage. Muszę sprawdzić moją tablicę i usunąć wszystkie duplikaty z niej, w zasadzie upewnić się, że wszystkie obiekty w tablicy mają unikatowe id. Widziałem niektóre rozwiązania przy użyciu , ale nie jestem pewien, jak dostosować je tutaj; Wiem też o Array(Set(myChats)), ale to nie działa dla tablicy niestandardowych obiektów.

+0

sprawdzić w ten sposób: http: //stackoverflow.com/questions/34709066/remove-duplicate-objects-in-an-array –

Odpowiedz

4

Można to zrobić z zestawem strun, tak:

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

Chodzi o to, aby zachować zbiór wszystkich identyfikatorów, które widzieliśmy do tej pory, przejść przez wszystkie elementy w pętli, i dodawać im identyfikatory, których nie widzieliśmy.

+0

używanie słownika byłoby prostsze nie? –

6

Tutaj jest rozszerzeniem Array powrócić unikalną listę obiektów opartych na danym kluczu:

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 
    } 
} 

dla przykładu zrobić:

let uniqueMessages = messages.unique{$0.id ?? ""} 
Powiązane problemy