Контакт без имени приводит к сбою приложения на 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)
    }
}

Когда у всех контактов есть имена, это работает, хотя, когда есть контакты без имен, приложение вылетает, и я получаю:

фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения

Я пытался использовать ? следующим образом:

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

Тогда я всегда получал бы nil.

Любые идеи, что я делаю неправильно?


person Xernox    schedule 26.11.2015    source источник
comment
Я не уверен, почему вы всегда получаете nil, но я бы рекомендовал больше проверять в стиле Swift, является ли необязательный нулевым или нет. Сделай так: if let contact2 = (ABRecordCopyCompositeName(person)?.takeRetainedValue() as? String){ contactList.append(contact2) }   -  person Juri Noga    schedule 26.11.2015
comment
Это именно то, что происходит, если у вас есть необязательные значения, и вы не проверяете, являются ли они необязательными: произойдет сбой. В этом идея и цель необязательных значений — падать, когда программист небрежен, вместо того, чтобы давать странные результаты. Если у вас есть необязательное значение, но оно отсутствует, вы должны проверить это.   -  person gnasher729    schedule 10.12.2015


Ответы (1)


По моему опыту, вы должны делать это шаг за шагом: сначала проверьте, не является ли ABRecordCopyCompositeName nil, а затем возьмите его и преобразуйте в строку.

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