在联系人框架中查找重复的联系人
Find duplicate contacts in Contacts Framework
在Swift3中,我使用了新的Contact Framework来操作联系人,但是我没有任何解决方案来获取重复的联系人。
知道如何实现吗?
你可以这样做:
/// Find Duplicates Contacts In Given Contacts Array
func findDuplicateContacts(Contacts contacts : [CNContact], completionHandler : @escaping (_ result : [Array<CNContact>]) -> ()){
let arrfullNames : [String?] = contacts.map{CNContactFormatter.string(from: [=10=], style: .fullName)}
var contactGroupedByDuplicated : [Array<CNContact>] = [Array<CNContact>]()
if let fullNames : [String] = arrfullNames as? [String]{
let uniqueArray = Array(Set(fullNames))
var contactGroupedByUnique = [Array<CNContact>]()
for fullName in uniqueArray {
let group = contacts.filter {
CNContactFormatter.string(from: [=10=], style: .fullName) == fullName
}
contactGroupedByUnique.append(group)
}
for items in contactGroupedByUnique{
if items.count > 1 {
contactGroupedByDuplicated.append(items)
}
}
}
completionHandler(contactGroupedByDuplicated)
}
我会构建一个按名称键入的字典,然后过滤出那些出现不止一次的名称:
let keys = [CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]
let request = CNContactFetchRequest(keysToFetch: keys)
var contactsByName = [String: [CNContact]]()
try! self.store.enumerateContacts(with: request) { contact, stop in
guard let name = CNContactFormatter.string(from: contact, style: .fullName) else { return }
contactsByName[name] = (contactsByName[name] ?? []) + [contact] // or in Swift 4, `contactsByName[name, default: []].append(contact)`
}
let duplicates = contactsByName.filter { .count > 1 }
在Swift3中,我使用了新的Contact Framework来操作联系人,但是我没有任何解决方案来获取重复的联系人。
知道如何实现吗?
你可以这样做:
/// Find Duplicates Contacts In Given Contacts Array
func findDuplicateContacts(Contacts contacts : [CNContact], completionHandler : @escaping (_ result : [Array<CNContact>]) -> ()){
let arrfullNames : [String?] = contacts.map{CNContactFormatter.string(from: [=10=], style: .fullName)}
var contactGroupedByDuplicated : [Array<CNContact>] = [Array<CNContact>]()
if let fullNames : [String] = arrfullNames as? [String]{
let uniqueArray = Array(Set(fullNames))
var contactGroupedByUnique = [Array<CNContact>]()
for fullName in uniqueArray {
let group = contacts.filter {
CNContactFormatter.string(from: [=10=], style: .fullName) == fullName
}
contactGroupedByUnique.append(group)
}
for items in contactGroupedByUnique{
if items.count > 1 {
contactGroupedByDuplicated.append(items)
}
}
}
completionHandler(contactGroupedByDuplicated)
}
我会构建一个按名称键入的字典,然后过滤出那些出现不止一次的名称:
let keys = [CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]
let request = CNContactFetchRequest(keysToFetch: keys)
var contactsByName = [String: [CNContact]]()
try! self.store.enumerateContacts(with: request) { contact, stop in
guard let name = CNContactFormatter.string(from: contact, style: .fullName) else { return }
contactsByName[name] = (contactsByName[name] ?? []) + [contact] // or in Swift 4, `contactsByName[name, default: []].append(contact)`
}
let duplicates = contactsByName.filter { .count > 1 }