Я пытаюсь получить имена контактов, вот как:Контакт без имени вызывает приложение аварии на 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
.
Любые идеи, что я делаю неправильно?
Я не уверен, почему вы всегда получаете 'nil', но я бы рекомендовал более проверять стиль Swift, независимо от того, является ли он нулевым или нет. Сделайте это так: 'if let contact2 = (ABRecordCopyCompositeName (person) ?. takeRetainedValue() как? String) { contactList.append (contact2) }' – njuri
Это именно то, что происходит, если у вас есть дополнительные значения, и вы не проверяете что они не являются обязательными: он потерпит крах. Это идея и назначение дополнительных значений, чтобы сбой, когда программист небрежен, а не дает странные результаты. Если у вас есть необязательное значение, и его нет, вы должны это проверить. – gnasher729