Eliminación de duplicates de la matriz de objects personalizados Swift

Tengo una class personalizada definida de la siguiente manera:

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

Ahora tengo una matriz myChats = [DisplayMessage]? . El campo id es único para cada object DisplayMessage . Necesito verificar mi matriz y eliminar todos los duplicates, básicamente, asegúrese de que todos los objects en la matriz tengan una id única. He visto algunas soluciones con NSMutableArray y Equatable pero no estoy seguro de cómo adaptarlas aquí; También sé de Array(Set(myChats)) sin embargo, eso no parece funcionar para una matriz de objects personalizados.

Puedes hacerlo con un set de cadenas, como esta:

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

La idea es mantener un set de todas las identificaciones que hemos visto hasta ahora, revisar todos los elementos en un ciclo y agregar unos identificadores que no hemos visto.

Aquí hay una extensión de matriz para devolver la list única de objects basada en una key determinada:

 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 arrayOrdenetworking = [Element]() //keeping the unique list of elements but ordenetworking for value in self { if !set.contains(map(value)) { set.insert(map(value)) arrayOrdenetworking.append(value) } } return arrayOrdenetworking } } 

para su ejemplo, haga:

 let uniqueMessages = messages.unique{$0.id ?? ""} 
 // Initialize the Array var a = [1,2,3,4,5,2,4,1,4,3,6,5] // Remove duplicates: // first by converting to a Set // and then back to Array a = Array(Set(a)) print(a) //[1,2,3,4,5,6] 

https://iswift.org/cookbook/remove-duplicates-from-array