2014-10-13 3 views
5

У меня есть словарь userInfo из UILocalNotification. Есть ли простой способ получить значение String при использовании неявной развертки?Получить строку из userInfo Словарь

Дает мне AnyObject, который я должен отнести к строке.

if let s = userInfo?["ID"] as String 

дает мне ошибку о StringLiteralConvertable

Просто не хочет, чтобы объявить две переменные, чтобы получить строку - один буквальную для развёртки и другого вара для литой строки.

Редактировать

Это мой метод. Это тоже не работает - я получаю (NSObject, AnyObject) не конвертируется в String в оператор if.

for notification in scheduledNotifications 
    { 
    // optional chainging 
    let userInfo = notification.userInfo 

    if let id = userInfo?[ "ID" ] as? String 
    { 
     println("Id found: " + id) 
    } 
    else 
    { 
     println("ID not found") 
    } 
    } 

Я не имею это в моем вопросе, но к тому же получать этот способ работы, я хотел бы на самом деле есть

if let s = notification.userInfo?["ID"] as String 

ответ

19

Вы хотите использовать условие отливать используя as? :

. (Примечание: Это работает для Xcode 6.1 для Xcode 6.0 см ниже)

if let s = userInfo?["ID"] as? String { 
    // When we get here, we know "ID" is a valid key 
    // and that the value is a String. 
} 

Эта конструкция надежно извлекает строку из userInfo:

  • Если userInfo является nil, userInfo?["ID"] возвращается nil за счет факультативно цепочки и условный бросок возвращает переменную типа String?, который имеет значение nil , Опция необязательная привязка затем сбой и блок не вводится.

  • Если "ID" - не действительный ключ в словаре, userInfo?["ID"] - возврат nil, и это происходит, как в предыдущем случае.

  • Если значение другого типа (например, Int), то условный бросокas? будет возвращать nil и она протекает, как выше случаев.

  • Наконец, если userInfo не nil и "ID" является допустимым ключом в словаре, а тип значения является String, то условного броска возвращает дополнительную строку String?, содержащую строку. необязательное связываниеif let затем разворачивает String и присваивает его s, который будет иметь тип String.


Для Xcode 6.0, есть еще одна вещь, которую вы должны сделать. Вам необходимо условно отдать NSString вместо String, потому что NSString - тип объекта, а String - нет. Они, очевидно, улучшились, что обработка в Xcode 6.1, но для Xcode 6.0 выполните следующие действия:

if let s:String = userInfo?["ID"] as? NSString { 
    // When we get here, we know "ID" is a valid key 
    // and that the value is a String. 
} 

Наконец, обращаясь к вашей последней точке:

for notification in scheduledNotifications 
    { 
     if let id:String = notification.userInfo?["ID"] as? NSString 
     { 
      println("Id found: " + id) 
     } 
     else 
     { 
      println("ID not found") 
     } 
    } 
+0

Это не сработало. Я отправил свою функцию. Кроме того, у меня нет его в исходном вопросе, но я изначально хотел получить доступ к userInfo из уведомления. Поэтому notification.userInfo ["ID"]. – Brian

+0

См. Мой обновленный ответ. – vacawama

+0

Спасибо. Я использовал Xcode 6.0.1. Обновлен до 6.1, и он сработал. – Brian