2016-09-27 3 views
1

Ich aktualisiere mein Projekt zu swift 3.0 und ich erhalte einen Fehler auf userInfo ["aps"]. Ich habe versucht, ein Fragezeichen und die Erklärung Punkt zwischen sie setzen aber kein GlückMehrdeutiger Verweis auf Index mit String-Literal und NSObject-Indextyp

private func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 

     if let aps = userInfo["aps"] as? NSDictionary { 
      if let alert = aps["alert"] as? NSDictionary { 
       if let message = alert["message"] as? NSString { 
        //Do stuff 
       } 
      } else if let alert = aps["alert"] as? NSString { 
       //Do stuff 
      } 
     } 


    } 
+0

immer den genauen Text der Fehlermeldung enthalten. – BaseZen

Antwort

2

Wie immer Verwendung Swift Collection-Typ, die Stiftung Sammlung Typen liefern keine Art Informationen über ihren Inhalt .

Verwenden Sie zuerst die tatsächliche Signatur der Delegate-Methode, markieren Sie die Methode als private und halten Sie die alte Signatur ist ein schlechter Kompromiss. Bedenken Sie jedoch, dass die Methode veraltet ist.

func application(_ application: UIApplication, didReceiveRemoteNotification 
         userInfo: [AnyHashable : Any]) 

Die JSON Collection-Typen sind immer [String:Any] (Wörterbuch) oder [[String:Any]] (Array)

func application(_ application: UIApplication, didReceiveRemoteNotification 
         userInfo: [AnyHashable : Any]) 

    if let aps = userInfo["aps"] as? [String:Any] { 
     if let alert = aps["alert"] as? [String:Any] { 
      if let message = alert["message"] as? String { 
       //Do stuff 
      } 
     } else if let alert = aps["alert"] as? String { 
      //Do stuff 
     } 
    } 
} 
-1

Swift 3 nicht mehr automatisch Werttypen überbrückt (String, das ist die Art von „aps“) zu Objective-C Referenztypen (NSString , ein Nachkomme des Typs NSObject Schlüssel Ihres Wörterbuch erforderlich)

So müssen Sie tun:

userInfo["aps" as NSString]

Sie könnten sich auch einige Probleme h sparen achdem diese Brückentechnik zu wiederholen: das Rest in native Swift Form so schnell wie möglich:

if let aps = userInfo["aps" as NSString] as? [String: AnyObject] { 
    if let alert = aps["alert"] as? [String: String], message = alert["message"] { 
     // message is now a Swift String 
    } 
    else if let alert = aps["alert"] as? String { 
     // alert is now a Swift String 
    } 
} 
+1

Der Vorschlag, Strings in Swift 3 mit 'NSString' zu überbrücken, ist ziemlich schlecht. Betrachte die entscheidenden Änderungen 'AnyObject' ->' Any' und '[NSObject: AnyObject]' -> '[AnyHashable: Any]' in Swift 3 – vadian

Verwandte Themen