如何在Swift中获取CNContact电话号码作为字符串?

Bay*_*ell 29 contacts addressbook ios swift ios9

我正在尝试检索所有联系人的姓名和电话号码,并在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
}
Run Code Online (Sandbox Code Playgroud)

完成后,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>>]
Run Code Online (Sandbox Code Playgroud)

我想知道如何将电话号码检索为字符串值,即"XXXXXXXXXX".基本上,如何调用数字值.谢谢!

Bay*_*ell 33

我找到了解决方案: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String

  • valueForKey( "数字")不是公共API,你应该使用属性stringValue的:`(contact.phoneNumbers.first .value的作为CNPhoneNumber?)?stringValue` (24认同)
  • 来自,HamzaGhazouani in swift 3,`((contact.phoneNumbers.first?.value)!as CNPhoneNumber).stringValue` (6认同)

Tel*_*ber 18

你可以contact.phoneNumbersCNLabeledValue获得:

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)")
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 还有一个要跳过的箍.第4行变为`let localizedLabel = CNLabeledValue <CNPhoneNumber> .localizedString(forLabel:label)` (7认同)

Suj*_*U N 15

/* 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!)
    }
Run Code Online (Sandbox Code Playgroud)

  • 非常方便(尽管有些不合常规的变量命名方案) (2认同)