2016-07-15 25 views
1

Ich versuche, zwei Arrays zu vergleichen. Ein Array ist ein Array von Person Objekten, von denen jedes über eine email Eigenschaft verfügt, die eine String E-Mail-Adresse ist. Das andere Array ist ein EmailAddress Objekt, das ein beschreibendes Wort wie "Arbeit" oder "persönlich" und die tatsächliche String E-Mail-Adresse hat.Swift Array Kreuzung nach Eigenschaft

Grundsätzlich haben beide Objekte eine String Eigenschaft für E-Mail-Adresse. Ich möchte diese Arrays von Objekten vergleichen, um zu sehen, ob eines der Objekte aus jedem Array die gleiche E-Mail-Adresse hat. Im Moment verwende ich verschachtelte for Loops wie unten gezeigt, aber das dauert zu lange.

for person in self.allPeople! { 
    for e in EmailAddresses! { 
     if e.value == person.email { 
      return true    
     } 
    } 
} 

Ich dachte über set intersection verwenden, aber das sah aus wie es nur zum Vergleich der gleichen Objekte funktionieren würde und Eigenschaften der nicht widersprechen. Vielen Dank.

Antwort

2

Sie können die Set-Funktionalität weiterhin verwenden, indem Sie zuerst eine Gruppe aller E-Mails erstellen. map hilft, eine Sammlung in eine andere zu verwandeln, in diesem Fall ändert sich Ihre Sammlung von allPeople in eine Sammlung von email s dieser Leute. Dies wird schneller sein, weil jetzt EmailAddresses einmal statt einmal pro Person iteriert wird.

let personEmails = Set(self.allPeople!.map { $0.email }) 
let matchingEmails = EmailAddresses!.map { $0.value } 
return !personEmails.isDisjoint(with: matchingEmails)