2015-07-14 5 views
0

Я работаю с контактами в моем приложении, пользователь может выбрать имя контакта ... но если первое имя или фамилия порожняком, я получаю эту ошибку: общаяНеожиданно найдено ноль

fatal error: unexpectedly found nil while unwrapping an Optional value

Я знаю, мой вопрос, возможно, повторяется, но я прочитал несколько статей, но не смог узнать, как решить мою проблему.

Вот мой код:

let firstName: ABMultiValueRef? = 
     ABRecordCopyValue(person, 
      kABPersonFirstNameProperty).takeRetainedValue() as ABMultiValueRef 


     let lastName: ABMultiValueRef? = 
     ABRecordCopyValue(person, 
      kABPersonLastNameProperty).takeRetainedValue() as ABMultiValueRef 

     titleField.text = ("\(firstName) \(lastName)") 

Я хочу, чтобы заполнить текстовое поле в любом случае.

EDIT:

Я нашел это решение от связанного с этим вопроса:

var name:String = "" 
     if let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String { 
      name += first 
     } 
     if let last = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String { 
      name += last 
     } 
     titleField.text = name 
} 

ответ

1

Посыпать некоторые ? «s вокруг для учета nil, например,

let firstName: ABMultiValueRef? = 
     ABRecordCopyValue(person, 
      kABPersonFirstNameProperty)?.takeRetainedValue() as? ABMultiValueRef 

You также должны быть подготовлены к возможности, чем firstName может быть nil и, например, использовать необязательное связывание с if let firstName: ABMultiValueRef = … и поместить любой код, основанный на firstName, в ветке then if. Все это будет выглядеть примерно так:

if let firstName: ABMultiValueRef = ABRecordCopyValue(person, 
     kABPersonFirstNameProperty)?.takeRetainedValue() as? ABMultiValueRef, 
     lastName: ABMultiValueRef = ABRecordCopyValue(person, 
     kABPersonLastNameProperty)?.takeRetainedValue() as? ABMultiValueRef { 
    titleField.text = "\(firstName) \(lastName)" 
} else { 
    titleField.text = "" // <- handle the failure case? 
} 
0

Попробуйте это,

if((let first = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String) && (let last = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as? String)) { 

    titleField.text = ("\(firstName) \(lastName)") 

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