2014-11-25 2 views
0

Я пытаюсь обработать словарь userInfo при получении удаленного push-уведомления, если в словаре отсутствует ожидаемый ключ. Я постоянно получаю unexpectedly found nil while unwrapping an Optional value ошибку, когда я пытаюсь сделать это:неожиданно нашел nil во время разворачивания необязательного значения при доступе к словарю с несуществующим ключом

if let message = userInfo["key_that_might_not_exist"] as? String { 
    // do something 
} 

Я подумал, что если ключ не существует, то он будет равен нулю. Что я здесь делаю неправильно?

+0

Почему вы не используете String? С Swift существует только редкая потребность в NSString. –

+2

Вы уверены, что ошибка в этой строке? вы пытались установить точку останова? – Antonio

+0

Почему вы угасаете? Подписывание словаря возвращает String ?, предполагая, что тип значения - String. – i40west

ответ

1

Попробуйте

if let message:String = a["key_that_might_not_exist"] { 
    // do something 
} 
+0

Я думаю, что генерирует ошибку компиляции - возможно, optonal downcast лучше – Antonio

+0

Я использовал String здесь, в то время как OP использует NSString (см. Мой комментарий выше). –

+0

Но аналогичный код на игровой площадке имеет 'AnyObject не идентичен String' ошибке - попробуйте сами:' var t: NSDictionary = ["1": "one"]; если пусть x: String = t ["1"] {} ' – Antonio

0

Прежде всего, используйте String; Я не думаю, что вам нужно иметь эту конкретную вещь как NSString.

Во-вторых, вы уверены, что userinfo существует? Вы можете легко установить сообщение неправильно. Попробуйте обернуть его в:

if let dictionary = userInfo { 

} 
0

- это ваша информация о пользователе действительно не нуль?

if let userInfo = notification.userInfo as? Dictionary<String,NSObject> { 
    if let message = userInfo["key_that_might_not_exist"] as? NSString { 
     ... 
    } 
}