我正在尝试检索联系人姓名,方法如下:

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)
    }
}

当所有联系人都有姓名时,它会起作用,尽管当有一些联系人没有姓名时,应用程序崩溃,我得到:
致命错误:解包可选值时意外发现nil
我尝试使用如下方法:
let contact2 = (ABRecordCopyCompositeName(person)?.takeRetainedValue() as? String)
 if contact2 != nil {
   contactList.append(contact2!)
 }

然后我就会得到。
知道我做错了什么吗?

最佳答案

根据我的经验,您必须一步一步地执行:首先检查ABRecordCopyCompositeName是否不nil,然后将其转换为字符串。

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

10-06 15:54