我试图在
Swift中做一些使用KVC在Objective-C中很容易做到的事情.在iOS9中添加的新
Contacts framework在大多数情况下比
old AddressBook API更容易使用.但是通过其手机号码找到联系人似乎很难.提供查找联系人的谓词仅限于名称和唯一标识符.在Objective-C中,您可以获取所有联系人,然后使用nspredicate过滤KVC查询.结构是:
CNContact-> phoneNumbers->(String,CNPhoneNumber-> stringValue)
let keys = [CNContactEmailAddressesKey,CNContactPhoneNumbersKey,CNContactFormatter.descriptorForrequiredKeysForStyle(.FullName)] let fetchRequest = CNContactFetchRequest(keysToFetch: keys) var contacts:[CNContact] = [] try! CNContactStore().enumerateContactsWithFetchRequest(fetchRequest) { ...
我想将stringValue与已知值进行比较.这是我到目前为止在游乐场所拥有的:
import UIKit import Contacts let JennysPhone = "111-867-5309" let SomeOtherPhone = "111-111-2222" let AndAThirdPhone = "111-222-5309" let contact1 = CNMutableContact() contact1.givenname = "Jenny" let phone1 = CNPhoneNumber(stringValue: JennysPhone) let phoneLabeled1 = CNLabeledValue(label: CNLabelPhoneNumberMobile,value: phone1) contact1.phoneNumbers.append(phoneLabeled1) let contact2 = CNMutableContact() contact2.givenname = "Billy" let phone2 = CNPhoneNumber(stringValue: SomeOtherPhone) let phoneLabeled2 = CNLabeledValue(label: CNLabelPhoneNumberMobile,value: phone2) contact2.phoneNumbers.append(phoneLabeled2) let contact3 = CNMutableContact() contact3.givenname = "Jimmy" let phone3 = CNPhoneNumber(stringValue: SomeOtherPhone) let phoneLabeled3 = CNLabeledValue(label: CNLabelPhoneNumberMobile,value: phone3) contact3.phoneNumbers.append(phoneLabeled3) let contacts = [contact1,contact2,contact3] let matches = contacts.filter { (contact) -> Bool in let phoneMatches = contact.phoneNumbers.filter({ (labeledValue) -> Bool in if let v = labeledValue.value as? CNPhoneNumber { return v.stringValue == JennysPhone } return false }) return phoneMatches.count > 0 } if let jennysNum = matches.first?.givenname { print("I think I found Jenny: \(jennysNum)") } else { print("I Could not find Jenny") }
这确实有效,但效率不高.在设备上,我需要在后台线程中运行它,如果此人有很多联系人,可能需要一段时间.有没有更好的方法使用新的iOS Contacts框架通过电话号码(或电子邮件地址,相同的想法)找到联系人?
解决方法
如果您正在寻找更快捷的方式:
let matches = contacts.filter { return $0.phoneNumbers .flatMap { $0.value as? CNPhoneNumber } .contains { $0.stringValue == JennysPhone } }
.flatMap将phoneNumbers的每个成员从CNLabeledValue类型转换为CNPhoneNumber类型,忽略那些无法转换的成员.
.contains检查这些电话号码是否与Jenny的号码相符.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。