IOS Swift 地址簿联系人

IOS Swift AddressBook Contacts

我有一个奇怪的问题,我试图从 IOS 地址簿 API 获取所有联系人,同时我试图获取属性的所有值(名字、姓氏、电子邮件和 phone 我正在获取的每个联系人的号码 "fatal error: unexpectedly found nil while unwrapping an Optional value"),就在我 运行 在我的设备上执行命令时,但是当我在 运行 上执行命令时xcode模拟器一切正常?

这是我的示例代码:

func getContactNames() {

        let people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray



        for person in people {


        let firstName = ABRecordCopyValue(person,
                kABPersonFirstNameProperty).takeRetainedValue() as! String

        let lastName = ABRecordCopyValue(person,
               kABPersonLastNameProperty).takeRetainedValue() as! String


        let email: ABMultiValueRef = ABRecordCopyValue(person,kABPersonEmailProperty).takeRetainedValue()

        println("First name = \(firstName)")
        println("Last name = \(lastName)")
        println("Email = \(email)")

    }
}

您可能会发现问题出在您对 as! String 的使用上。如果您的地址簿中的任何条目没有名字或姓氏,那么您正试图保留 nil,因此出现错误。

我对这个问题的解决方案是使用如下代码:

public func stringPropertyValue(record: ABRecord, id:ABPropertyID) -> String! {
    var result: String! = nil
    if let v = ABRecordCopyValue(record, id) {
        result = v.takeRetainedValue() as! String
    }
    return result
}

你可以这样设置变量:

let firstName = stringPropertyValue(person, id:kABPersonFirstNameProperty)
let lastName = stringPropertyValue(person, id:kABPersonLastNameProperty)

结果变量是隐含的可选值,但它们不会导致解包错误。根据 iOS 9 / Xcode 7

中新的 Contacts 框架,上述函数可以很容易地改造成 class 结构