从自定义对象数组中删除重复项Swift

我有一个自定义的类定义如下:

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解决scheme,但我不知道如何适应它们。 我也知道Array(Set(myChats))但是这似乎不适用于自定义对象数组。

你可以用一组string来完成,像这样:

 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。

下面是一个数组扩展,用于根据给定的键返回唯一的对象列表:

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

为你的例子做:

 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