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 है। मैंने NSMutableArray और Equatable का उपयोग करके कुछ समाधान देखे हैं, हालांकि मुझे यकीन नहीं है कि उन्हें यहां कैसे अनुकूलित किया जाए; मुझे Array(Set(myChats)) के बारे में भी पता है, हालांकि यह कस्टम ऑब्जेक्ट्स की सरणी के लिए काम नहीं कर रहा है।

+0

जांच इस http: //stackoverflow.com/प्रश्न/34709066/हटाएं-डुप्लिकेट-ऑब्जेक्ट-इन-ए-एरे –

उत्तर

4

आप तार का एक सेट के साथ यह कर सकते हैं, इस तरह:

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

अपने उदाहरण के लिए कार्य करें:

let uniqueMessages = messages.unique{$0.id ?? ""} 
संबंधित मुद्दे