如何在Swift中以string的forms获取CNContact电话号码?

我正在尝试检索所有联系人的姓名和电话号码,并将其与iOS中的Swift放入数组中。 我已经做到了这一点:

func findContacts() -> [CNContact] { marrContactsNumber.removeAllObjects() marrContactsName.removeAllObjects() let store = CNContactStore() let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) var contacts = [CNContact]() do { try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in contacts.append(contact) self.marrContactsName.addObject(contact.givenName + " " + contact.familyName) self.marrContactsNumber.addObject(contact.phoneNumbers) print(contact.phoneNumbers) } catch let error as NSError { print(error.localizedDescription) } print(marrContactsName.count) print(marrContactsNumber.count) return contacts } 

一旦完成, marrContactsName包含所有我的联系人的名称完全按照预期的数组。 即“John Doe”。 但是, marrContactsNumber返回一个类似于数组的值

 [<CNLabeledValue: 0x158a19950: identifier=F831DC7E-5896-420F-AE46-489F6C14DA6E, label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a19640: countryCode=us, digits=6751420000>>, <CNLabeledValue: 0x158a19a80: identifier=ECD66568-C6DD-441D-9448-BDEDDE9A68E1, label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a199b0: countryCode=us, digits=5342766455>>] 

我想知道如何检索电话号码(S)作为一个string值(S),即“XXXXXXXXXX”。 基本上,如何调用数字值。 谢谢!

我find了解决办法: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String

你可以从CNLabeledValue获得contact.phoneNumbers

 for phoneNumber in contact.phoneNumbers { if let number = phoneNumber.value as? CNPhoneNumber, let label = phoneNumber.label { let localizedLabel = CNLabeledValue.localizedStringForLabel(label) print("\(localizedLabel) \(number.stringValue)") } } 
 /* Get only first mobile number */ let MobNumVar = (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String print(MobNumVar) /* Get all mobile number */ for ContctNumVar: CNLabeledValue in contact.phoneNumbers { let MobNumVar = (ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String print(MobNumVar!) } /* Get mobile number with mobile country code */ for ContctNumVar: CNLabeledValue in contact.phoneNumbers { let FulMobNumVar = ContctNumVar.value as! CNPhoneNumber let MccNamVar = FulMobNumVar.valueForKey("countryCode") as? String let MobNumVar = FulMobNumVar.valueForKey("digits") as? String print(MccNamVar!) print(MobNumVar!) } 

CNLabeledValue的定义:

CNLabeledValue类是一个线程安全的类,它定义了将联系人属性值与标签组合在一起的不可变值对象。 例如,联系人电话号码可以有“家庭”,“工作”,“iPhone”等标签。

CNContact.phoneNumbers是一个CNLabeledValues数组,每个CNLabeledValue都有一个标签和一个值。

要打印与CNContact相对应的电话号码,您可以尝试:

 for phoneNumber in contact.phoneNumbers { print("The \(phoneNumber.label) number of \(contact.givenName) is: \(phoneNumber.value)") } 

在迅速3你可以得到direclty

  if item.isKeyAvailable(CNContactPhoneNumbersKey){ let phoneNOs=item.phoneNumbers let phNo:String for item in phoneNOs{ print("Phone Nos \(item.value.stringValue)") } 

Swift 3 "_$!<Mobile>!$_"这个项目是为创造差异而写的,同时也提供了一个依赖各种选项的机会。

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

这里我们有num.value.stringValue