2017-01-16 2 views
1

Ich versuche eine einfache Wetter-App zu erstellen, die den Standort des Benutzers erfasst und einfache Wetterdaten mit der Google Maps API anzeigt. Alles funktioniert, außer für diesen Teil, wo ich den JSON nehme und die Adresse bekomme.Wie konvertiert man NSData zu Daten in Swift 3?

func getAddressForLatLng(latitude: String, longitude: String) { 
    let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)") 
    let data = NSData(contentsOf: url! as URL) 
    let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 
    if let result = json["results"] as? Dictionary { 
     if let address = result[0]["address_components"] as? Array { 
      let number = address[0]["short_name"] as! String 
      let street = address[1]["short_name"] as! String 
      let city = address[2]["short_name"] as! String 
      let state = address[4]["short_name"] as! String 
      let zip = address[6]["short_name"] as! String 
      weatherDisplay.text = "\(city),\(state)" 
     } 
    } 
} 

Auf der Linie:

let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 

ich diesen Fehler:

Cannot invoke 'jsonObject' with an argument list of type '(with: NSData?, options: JSONSerialization.ReadingOptions)' 

Was mache ich falsch?

+5

Keine Notwendigkeit, hier NSData (oder NSURL) überhaupt zu benutzen. 'let url = URL (string: ...)', 'let data = Daten (contentsOf: ...)' –

+0

Das Problem ist, dass Sie ein optionales 'JSONSerialization' übergeben. Sie können Unwrap-Daten erzwingen, z. 'JSONSerialization.jsonObject (mit: data !, Optionen: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary' –

+2

Beachten Sie, dass 'NSData (contentsOf: url! As URL)' (oder 'Data (contentsOf:)' 'in Swift 3) eine schlechte Idee ist. Das ist ein synchroner Aufruf und wird die Benutzeroberfläche bis zum Abschluss einfrieren. Sie sollten dies wirklich neu schreiben, um NSURLSession zu verwenden. –

Antwort

3

Sie müssen ein paar Dinge ändern. Zuerst verwenden Sie NSData. Sie sollten den Swift-Typ Data verwenden. Um von NSData? zu Data? zu konvertieren, fügen Sie am Ende der Variablendeklaration einfach as Data? hinzu.

Auch ist Ihre Art optional, aber Sie können nicht in einem optionalen Typ passieren, so müssen Sie es auszupacken (Verwendung in diesem Beispiel if let data = data { /* stuff here */}):

func getAddressForLatLng(latitude: String, longitude: String) { 
    let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)") 
    let data = NSData(contentsOf: url! as URL) as Data? // <==== Added 'as Data?' 
    if let data = data { // <====== Added 'if let' 
     let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 
     if let result = json["results"] as? Dictionary { 
      if let address = result[0]["address_components"] as? Array { 
       let number = address[0]["short_name"] as! String 
       let street = address[1]["short_name"] as! String 
       let city = address[2]["short_name"] as! String 
       let state = address[4]["short_name"] as! String 
       let zip = address[6]["short_name"] as! String 
       weatherDisplay.text = "\(city),\(state)" 
      } 
     } 
    } 
} 

Update:

Eine andere Sache, die Sie ändern müssen, ist:

let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 

Wenn Sie auf den Typ Dictionary werfen, die Hirschkuh Compiler Ich weiß nicht, wovon du redest, denn Dictionary ist ein generic type. Sie müssen also Dictionary<String, AnyObject> oder [String: AnyObject] (Sie sind die gleichen).

+0

Danke für die schnelle Antwort! Jetzt heißt es (in der let = json Zeile) "Generic Parameter 'key' konnte nicht abgeleitet werden in 'Dictionary <_,_>" –

+0

@EricPhillips Meine Antwort wurde aktualisiert! –

+0

jetzt, in der Zeile 'wenn Adresse = Ergebnis [0] [" Adresse_Komponenten "] als? Array {', es heißt" Unklarer Verweis auf Mitglied 'tiefgestellt' ".Gibt es noch etwas, das ich hinzufügen/ändern sollte? –

Verwandte Themen