如何使用 Swift 3 获取未命名为 "John" 的联系人
How to fetch contacts NOT named "John" with Swift 3
有没有一种方法可以使用 Contacts framework 不带 属性来获取联系人?
示例:
myContactArray = unifiedContactsNotCalled("John")
PS:我知道该行与真实代码完全不同,它只是一个用于说明目的的服务建议
在概述如何查找与名称不匹配的内容之前,让我们回顾一下如何找到与名称匹配的内容。简而言之,您将使用谓词:
let predicate = CNContact.predicateForContacts(matchingName: searchString)
let matches = try store.unifiedContacts(matching: predicate, keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) // use whatever keys you want
(显然,您可以将其包装在 do
-try
-catch
构造中,或者您想要的任何错误处理模式。)
遗憾的是,您不能将自己的自定义谓词与联系人框架一起使用,而只能使用 CNContact
预定义的谓词。因此,如果您想查找姓名不包含 "John" 的联系人,您必须手动 enumerateContacts(with:)
并从中构建结果:
let formatter = CNContactFormatter()
formatter.style = .fullName
let request = CNContactFetchRequest(keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) // include whatever other keys you may need
// find those contacts that do not contain the search string
var matches = [CNContact]()
try store.enumerateContacts(with: request) { contact, stop in
if !(formatter.string(from: contact)?.localizedCaseInsensitiveContains(searchString) ?? false) {
matches.append(contact)
}
}
有没有一种方法可以使用 Contacts framework 不带 属性来获取联系人?
示例:
myContactArray = unifiedContactsNotCalled("John")
PS:我知道该行与真实代码完全不同,它只是一个用于说明目的的服务建议
在概述如何查找与名称不匹配的内容之前,让我们回顾一下如何找到与名称匹配的内容。简而言之,您将使用谓词:
let predicate = CNContact.predicateForContacts(matchingName: searchString)
let matches = try store.unifiedContacts(matching: predicate, keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) // use whatever keys you want
(显然,您可以将其包装在 do
-try
-catch
构造中,或者您想要的任何错误处理模式。)
遗憾的是,您不能将自己的自定义谓词与联系人框架一起使用,而只能使用 CNContact
预定义的谓词。因此,如果您想查找姓名不包含 "John" 的联系人,您必须手动 enumerateContacts(with:)
并从中构建结果:
let formatter = CNContactFormatter()
formatter.style = .fullName
let request = CNContactFetchRequest(keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) // include whatever other keys you may need
// find those contacts that do not contain the search string
var matches = [CNContact]()
try store.enumerateContacts(with: request) { contact, stop in
if !(formatter.string(from: contact)?.localizedCaseInsensitiveContains(searchString) ?? false) {
matches.append(contact)
}
}