2016-07-15 3 views
1

두 개의 배열을 비교하려고합니다. 하나의 배열은 Person 개체의 배열이며 각각 속성을 가지고 String 전자 메일 주소입니다. 다른 배열은 "work"또는 "personal"과 같은 설명 어와 실제 String 전자 메일 주소가있는 EmailAddress 개체입니다.속성 별 스위프트 배열 교차점

기본적으로 두 개체의 이메일 주소는 String입니다. 개체의 배열을 비교하여 각 배열의 개체 중 하나에 동일한 전자 메일 주소가 있는지 확인하려고합니다. 지금은 아래와 같이 중첩 된 for 루프를 사용하고 있지만 너무 오래 걸립니다.

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

나는 set intersection 사용에 대한 생각하지만 그것은 단지 같은 객체를 비교하는 일을하고의 속성을 반대하지 것처럼 보였다. 감사.

답변

2

먼저 모든 이메일 세트를 생성하여 Set 기능을 사용할 수 있습니다. map은 한 컬렉션을 다른 컬렉션으로 바꾸는 데 도움이됩니다.이 경우 컬렉션 allPeople을 해당 사람들의 email 컬렉션으로 변경합니다. 이제는 EmailAddresses이 한 번 반복되는 대신 한 번에 이 아니기 때문에 더 빨라질 것입니다.

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