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

Когато всички контакти имат имена, това работи, въпреки че когато има някои контакти без имена, приложението се срива и получавам:

фатална грешка: неочаквано намерена нула при разопаковане на незадължителна стойност

Опитах да използвам ? така:

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

Тогава винаги ще получавам nil.

Някакви идеи какво правя погрешно?


person Xernox    schedule 26.11.2015    source източник
comment
Не съм сигурен защо винаги получавате nil, но бих препоръчал повече проверка в стил Swift дали Optional е нула или не. Направи го така: 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