J'essaie de créer une application météo simple qui saisit l'emplacement de l'utilisateur et affiche des données météorologiques simples à l'aide de l'API Google Maps. Tout fonctionne, sauf pour cette partie où je prends le JSON et récupère l'adresse.

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)"
        }
    }
}

Sur la ligne:

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

Je reçois cette erreur:

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

Qu'est-ce que je fais mal?

6
Eric Phillips 16 janv. 2017 à 21:45

2 réponses

Meilleure réponse

Vous devez changer quelques choses. Tout d'abord, vous utilisez NSData. Vous devriez utiliser le type Swift Data. Pour convertir de NSData? en Data?, ajoutez simplement as Data? à la fin de la déclaration de variable.

De plus, votre type est facultatif, mais vous ne pouvez pas transmettre un type facultatif, vous devez donc le dérouler (en utilisant, dans cet exemple, 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)"
            }
        }
    }
}

Mise à jour:

Une autre chose que vous devez changer est:

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

Lorsque vous lancez le type Dictionary, le compilateur ne sait pas de quoi vous parlez car Dictionary est un type générique. Vous devez donc diffuser sur Dictionary<String, AnyObject> ou [String: AnyObject] (ce sont les mêmes).

8
Caleb Kleveter 16 janv. 2017 à 20:43
let nsdata = NSData()    
let data = Data(referencing: nsdata)

https://developer.apple.com/documentation/foundation/data/3126627-init

19
agandi 20 févr. 2020 à 13:36