Swift2 IOS Swift通讯录联系人

Swift2 IOS Swift通讯录联系人,swift2,Swift2,我有一个奇怪的问题,我正在尝试从IOS addressbook API获取所有联系人,同时我正在尝试获取属性的所有值(我正在设置的每个联系人的名字、姓氏、电子邮件和电话号码“致命错误:在解包可选值时意外发现为零”),就在我在设备上运行该命令时,但是当我在xcode模拟器上运行命令时,一切都正常吗 以下是我的示例代码: func getContactNames() { let people = ABAddressBookCopyArrayOfAllPeople(addressBo

我有一个奇怪的问题,我正在尝试从IOS addressbook API获取所有联系人,同时我正在尝试获取属性的所有值(我正在设置的每个联系人的名字、姓氏、电子邮件和电话号码“致命错误:在解包可选值时意外发现为零”),就在我在设备上运行该命令时,但是当我在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!字符串
。如果通讯簿中的任何条目没有名字或姓氏,则您试图保留一个
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中新联系人框架的思路重新编写成类结构

您可能会发现问题在于使用
as!字符串
。如果通讯簿中的任何条目没有名字或姓氏,则您试图保留一个
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中新联系人框架的思路重新构建成一个类结构

您用
swift2
标记了它,但我在代码块中看到的是
println
而不是swift2的
print
。您使用的是哪个版本的Xcode?还有,崩溃发生在哪一行?请用户访问他们的通讯簿。答案很好。您在代码块中用
swift2
标记了它,但我看到的是
println
而不是swift2的
print
。您使用的是哪个版本的Xcode?另外,崩溃发生在哪一行?询问用户访问他们的地址簿。这里回答得很好。用户声称他的代码在模拟器上运行良好。这应该是平台和隐私设置的问题。@Prabhu.Somasundaram是错误的:它与平台和隐私设置无关,而与数据库中的实际数据有关。它在模拟器中工作的原因可能是测试数据库中的所有条目都有名字和姓氏,因此故障没有发生。实时通讯簿可能包含没有名字和姓氏的记录,这会导致问题。对nil使用“as!”会引发一个异常:如果名字或姓氏为nil,则会崩溃。用户声称他的代码在模拟器上运行良好。这应该是平台和隐私设置的问题。@Prabhu.Somasundaram是错误的:它与平台和隐私设置无关,而与数据库中的实际数据有关。它在模拟器中工作的原因可能是测试数据库中的所有条目都有名字和姓氏,因此故障没有发生。实时通讯簿可能包含没有名字和姓氏的记录,这会导致问题。对nil使用“as!”会引发一个异常:如果名字或姓氏为nil,则会崩溃。