2015-11-26 43 views
2

我试图检索联系人的名字,这里的如何:联系不名会导致应用程序崩溃的iPhone

func getContactNames() { 
    let adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue() 

    let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as [ABRecord] 
    for person in people { 
     contactList.append(ABRecordCopyCompositeName(person).takeRetainedValue() as String) 
    } 
} 

当所有联系人确实有它的作品的名字,虽然那时有没有名字,应用程序崩溃一些接触我得到:

fatal error: unexpectedly found nil while unwrapping an Optional value

我尝试使用?这样的:

let contact2 = (ABRecordCopyCompositeName(person)?.takeRetainedValue() as? String) 
if contact2 != nil { 
    contactList.append(contact2!) 
} 

然后我WOU ld总是得到nil

任何想法我做错了什么?

+1

我不确定你为什么总是得到'nil',但我会推荐更多Swift样式检查Optional是否为零。这样做:'如果让contact2 =(ABRecordCopyCompositeName(person)?. takeRetainedValue()as?String){ contactList.append(contact2) }' – njuri

+1

这就是如果你有可选值并且你没有检查他们是可选的:它会崩溃。这是可选值的概念和目的,当程序员不小心而不是给出奇怪的结果时会崩溃。如果您有一个可选值并且不存在,则必须检查该值。 – gnasher729

回答

1

以我的经验,你必须一步一步做:首先检查ABRecordCopyCompositeName是不是nil然后把它并转换为字符串。

if let tmpName = ABRecordCopyCompositeName(person) { 
    let contact2 = tmpName.takeRetainedValue() as String 
    contactList.append(contact2) 
}