2016-08-04 30 views
-2

Meine andere Frage wurde markiert als identisch mit einem anderen, aber es beantwortete nicht das Problem, das ich hatte. HierExtrahieren von Werten aus AnyObject Dictionary in Array

ist der Code:

if status == "OK" { 


    self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<NSObject, AnyObject>>)[0] 
    self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<NSObject, AnyObject> 

    let legs = self.selectedRoute["legs"] as! Array<Dictionary<NSObject, AnyObject>> 
    let steps = legs[0]["steps"]! 

    for i in 0...steps.count - 1 { 
     let step_coordinate = steps[i]["start_location"]! 
     print(step_coordinate!["lat"]!!) 

    } 

} 

Die print-Anweisung gibt diesem Ergebnis

40.7609205 
40.7640121 
40.7595325 
40.7501637 
40.7481923 
40.7393448 
40.7252038 
40.7225337 
40.718295 

aber wenn ich die print-Anweisung tauschen die Werte zu greifen und sie in einem Array bekomme ich die fataler Fehler: NULL gefunden.

Kann jemand erklären, warum das der Fall ist? Wie kann ich diese Werte greifen, wenn nicht durch eine for-Schleife?

+3

Tun Sie sich selbst einen Gefallen und versuchen Sie nicht, 'zu verwenden!' Und andere kraft Abwickeln Operationen. Stattdessen sollten Sie 'optionale' Werte richtig testen und auspacken. Force-Unwrapping kann zu unangenehmen, schwer zu findenden Laufzeitausnahmen führen. Versuchen Sie auch, Ihre Frage mit einem [minimalen, vollständigen und überprüfbaren Beispiel] zu formatieren (http://stackoverflow.com/help/mcve) – ColGraff

+1

'für i in 0 ... steps.count - 1' kann einfach sein: 'für i in 0 .. Alexander

+0

@ColGraff Du hast Recht, danke. Ich werde versuchen, es in Zukunft zu vermeiden. Ich bin mir nicht sicher, wie ich das Beispiel anpassen soll, weil ich nur nach einer Möglichkeit suche, die Werte, die ich oben gezeigt habe, zu speichern, die von step_coordinate ["lat"] kommen. Ich habe versucht, es wie ein Array zu behandeln und es scheitert, also bin ich mir nicht sicher, wie ich sie greifen soll. – tryingtolearn

Antwort

1

Hier ist eine sauberere Version Ihres Codes.

Regeln:

  1. Sie nichts unwrap zwingen!
  2. Optional können Werte aus [NSObject: AnyObject] Suchvorgängen eingegeben werden.
  3. Verwenden Sie guard Anweisungen und if let, um Optionale sicher auszupacken.
  4. Indexieren Sie keine Arrays, die leer sein könnten, ohne zuerst zu prüfen.

if status == "OK" { 
    guard let routes = dictionary["routes"] as? [[NSObject: AnyObject]] else { return } 
    self.selectedRoute = routes.first ?? [:] 

    self.overviewPolyline = self.selectedRoute["overview_polyline"] as? [NSObject: AnyObject] ?? [:] 

    guard let legs = self.selectedRoute["legs"] as? [[NSObject: AnyObject]] else { return } 

    let firstleg = legs.first ?? [:] 
    guard let steps = firstleg["steps"] as? [[NSObject: AnyObject]] else { return } 

    for step in steps { 
     if let step_coordinate = step["start_location"] as? [NSObject: AnyObject] { 
      if let lat = step_coordinate["lat"] as? Double { 
       print(lat) 

       // append lat to array of lats 
       lats.append(lat) 
      } 
     } 
    } 
} 
+0

Wow, vielen Dank, das ist genau das, was ich brauchte. Der aufgeräumte Code erlaubt mir den Zugriff auf die Variablen viel einfacher. Prost. – tryingtolearn