2015-11-26 2 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, независимо от того, является ли он нулевым или нет. Сделайте это так: 'if let contact2 = (ABRecordCopyCompositeName (person) ?. takeRetainedValue() как? String) { contactList.append (contact2) }' – njuri

+1

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

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^