2017-11-26 1 views
0

Ich habe diesen Beitrag eine Reihe gesehen, aber ich kann keine finden, die sich auf die neuesten Versionen von Swift oder Alamofire beziehen. Ich bin neu zu schnell und ich versuche, eine JSON-Datei zu analysieren, aber es druckt weiter Optional(*the data*). Ich verstehe, dass dies etwas damit zu tun hat, dass Typen nicht überprüft werden, aber ich kann es nicht genau herausfinden.Alamofire druckt "Optional (Daten)", wie kann ich "Optional" loswerden

Alamofire.request("url", encoding: JSONEncoding.default) 
     .responseJSON { response in 
      //to get JSON return value 
      if let result = response.result.value { 
       let JSON = result as! [[String:Any]] 
       print(JSON[0]["price_usd"]) 

      } 

    } 

Ich habe auch versucht eine if-Anweisung in der Zeile let JSON = result as! [[String:Any]] aber das half nicht. Vielen Dank!

Antwort

1

Das Problem ist nicht das Unwrapping von result, sondern eher, dass der Subscript-Operator, um etwas aus einem Dictionary abrufen, ist immer ein "optional". Ich würde vorschlagen, dass Sie sich über Optionals in The Swift Programming Language: The Basics: Optionals informieren. Siehe auch the Dictionary overview documentation.

Wie auch immer, Ihr Beispiel, wenn Sie wirklich ein Array von Wörterbüchern erhalten und Sie wollen den optionalen Wert aus dem Subscript-Operator für price_usd Schlüssel des ersten Wörterbuchs entpacken. So verwendet if let oder guard let die optional auspacken:

Alamofire.request("url", encoding: JSONEncoding.default) 
    .responseJSON { response in 
     guard let result = response.result.value as? [[String: Any]], 
      let usd = result.first?["price_usd"] as? Double else { 
       print("not found") 
       return 
     } 

     print(usd) 
} 

Oder, wenn price_usd ‚s-Wert als String im JSON gespeichert wurde (dh mit Anführungszeichen um es):

Alamofire.request("url", encoding: JSONEncoding.default) 
    .responseJSON { response in 
     guard let result = response.result.value as? [[String: Any]], 
      let string = result.first?["price_usd"] as? String, 
      let usd = Double(string) else { 
       print("not found") 
       return 
     } 

     print(usd) 
} 

Hinweis, Ich habe sorgfältig vermieden, as! erzwungene Auspacken, weil die App würde bald abstürzen, wenn der Schlüssel nicht gefunden wurde. Beachten Sie auch, dass ich den tiefgestellten Operator [0] eliminiert habe, der abstürzen würde, wenn das Array leer wäre, und stattdessen die Funktion first mit optionaler Verkettung verwendet.

Verwandte Themen