2014-10-13 14 views
5

Possiedo un dizionario UserInfo da una UILocalNotification. C'è un modo semplice per ottenere il valore di stringa quando si utilizza lo scostamento implicito?Ottieni una stringa dal dizionario utenteInfo

if let s = userInfo?["ID"] 

Fornisce un oggetto AnyObject che devo trasmettere a una stringa.

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

mi dà un errore circa StringLiteralConvertable

Semplicemente non vogliono avere a dichiarare due variabili per ottenere una stringa - letterale per l'unwrap e un altro per la stringa var fuso.

Modifica

Ecco il mio metodo. Anche questo non funziona: I get (NSObject, AnyObject) non è convertibile in String sull'istruzione 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") 
    } 
    } 

io non ce l'ho nella mia interrogazione, ma oltre ad ottenere in questo modo di lavorare, mi piacerebbe avere in realtà

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

risposta

19

Si desidera utilizzare una condizione gettato utilizzando as? :

(Nota:. Questo funziona per Xcode 6.1 per Xcode 6.0, vedi sotto)

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. 
} 
.210

Questo costrutto estrae sicuro una stringa da userInfo:

  • Se userInfo è nil, userInfo?["ID"] rendimenti nil causa opzionale concatenamento e getto condizionale restituisce una variabile di tipo String? che ha un valore di nil . Il binding opzionale fallisce e il blocco non viene inserito.

  • Se "ID" non è una chiave valida nel dizionario, userInfo?["ID"] restituisce nil e procede come nel caso precedente.

  • Se il valore è un altro tipo (come Int), allora il getto condizionaleas? tornerà nil e procede come nei casi precedenti.

  • Infine, se userInfo non è nil, e "ID" è una chiave valida nel dizionario, e il tipo di valore è un String, allora la fusione condizionale restituisce una stringa opzionale String? che contiene la stringa. L'associazione facoltativaif let rimuove quindi lo String e lo assegna a s che avrà il tipo String.


Per Xcode 6.0, c'è una cosa aggiuntiva che si deve fare. È necessario eseguire il cast condizionale su NSString anziché su String perché NSString è un tipo di oggetto e non lo è String. A quanto pare migliorato che la gestione in Xcode 6.1, ma per Xcode 6.0 effettuare le seguenti operazioni:

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. 
} 

Infine, affrontando l'ultimo punto:

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

Questo non ha funzionato. Ho pubblicato la mia funzione. Inoltre, non ho nella domanda originale, ma originariamente volevo accedere a userInfo dalla notifica. Quindi notification.userInfo ["ID"]. – Brian

+0

Vedere la mia risposta aggiornata. – vacawama

+0

Grazie. Stavo usando Xcode 6.0.1. Aggiornato a 6.1 e ha funzionato. – Brian

Problemi correlati