2016-09-03 19 views
6

Tôi có một lớp tùy chỉnh được xác định như sau:Duplicates Loại bỏ Từ Mảng Hải quan Objects Swift

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

Bây giờ tôi có một mảng myChats = [DisplayMessage]?. Trường id là duy nhất cho mỗi đối tượng DisplayMessage. Tôi cần phải kiểm tra mảng của tôi và loại bỏ tất cả các bản sao từ nó, về cơ bản đảm bảo rằng tất cả các đối tượng trong mảng có một độc đáo id. Tôi đã thấy một số giải pháp sử dụng NSMutableArrayEquatable tuy nhiên tôi không chắc chắn cách điều chỉnh chúng ở đây; Tôi cũng biết về Array(Set(myChats)) tuy nhiên điều đó dường như không hoạt động đối với một loạt các đối tượng tùy chỉnh.

+0

việc kiểm tra này: http: //stackoverflow.com/question/34709066/remove-duplicate-objects-in-an-array –

Trả lời

4

Bạn có thể làm điều đó với một tập hợp các chuỗi, như thế này:

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

Ý tưởng là để giữ một bộ tất cả các ID mà chúng tôi đã thấy cho đến nay, đi qua tất cả các mục trong một vòng lặp, và thêm những ID mà chúng ta chưa thấy.

+0

sử dụng từ điển sẽ đơn giản hơn không? –

6

Đây là một phần mở rộng mảng để trả lại danh sách duy nhất của đối tượng dựa trên một chìa khóa đưa ra:

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

ví dụ bạn làm:

let uniqueMessages = messages.unique{$0.id ?? ""} 
Các vấn đề liên quan