如何使用CNContacts快速获取移动号码?

我有一些代码来检索用户联系人中的所有电话号码,但只想过滤掉手机号码。 目前,我只是通过在数组中添加第一个数字“+”或第二个数字“7”的数字,如下所示:

func findContacts () -> [CNContact]{ let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactPhoneNumbersKey] let fetchRequest: CNContactFetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) var contacts = [CNContact]() CNContact.localizedStringForKey(CNLabelPhoneNumberiPhone) fetchRequest.mutableObjects = false fetchRequest.unifyResults = true fetchRequest.sortOrder = .UserDefault let contactStoreID = CNContactStore().defaultContainerIdentifier() do { try CNContactStore( ).enumerateContactsWithFetchRequest(fetchRequest) { (let contact, let stop) -> Void in if contact.phoneNumbers.count > 0 { contacts.append(contact) } if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { for phoneNumber:CNLabeledValue in contact.phoneNumbers { let number = phoneNumber.value as! CNPhoneNumber print(number.stringValue) let index = number.stringValue.startIndex.advancedBy(1) let indexPlus = number.stringValue.startIndex.advancedBy(0) if number.stringValue[index] == Character(String(7)) || number.stringValue[indexPlus] == Character("+"){ self.allNumbers.append("\(number.stringValue)") } } } } 

由于联系人存储在iPhone上的“移动”标签,我想知道如果只有这些数字可以添加到数组。 谢谢 :)

检查号码的标签是否像这样移动:

 var mobiles = [CNPhoneNumber]() for num in contact.phoneNumbers { let numVal = num.value as! CNPhoneNumber if num.label == CNLabelPhoneNumberMobile { mobiles.append(numVal) } } 

那么你有一个这个人的手机号码数组。

在这篇文章中提到了使用flatMapcontains的更好的方法。 Swift嵌套filter优化?

另一种方法为更多的游客:

 for con in contacts { for num in con.phoneNumbers { if num.label == "_$!<Mobile>!$_" { self.contactNames.append(con.givenName) self.contactNums.append(num.value.stringValue) break } else { continue } } }