これはJSONを使った最初のプロジェクトです。この質問は、おそらく同じ状況の他の人に関係する可能性があります。 DarkSky APIを使用して天気アプリを作成しています。これまでは、インターネットからデータを要求して解析し、テストのためにコンソールで印刷しました。残念ながら、私はまったく役に立たない。ここでは、関連するコードは次のとおりです。JSONを解析するとnilが返されます、なぜですか?
- 私のViewControllerで>機能:
func getWeatherData(latitude: String, longitude: String, time: String) {
let basePath = "https://api.darksky.net/forecast/xxxxxxxxxxxxxxxb170/"
let url = basePath + "\(latitude),\(longitude)"
let request = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.dataTask(with: request) {
(data:Data?, response:URLResponse?, error:Error?)
in
if let data = data {
do {
if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {
let dictionary = json
UserDefaults.standard.set(dictionary, forKey: "lastWeatherUpdate")
}
} catch {
print(error.localizedDescription)
}
}
}
}
func getCurrentWeather() {
getWeatherData(latitude: "37", longitude: "40", time: "40000")
let weather = UserDefaults.standard.dictionary(forKey: "lastWeatherUpdate")
print(weather?["latitude"])
}
は、誰かが私の間違いを見つけていますか?ここでDarkSkyは、JSONデータの構造を指定する方法は次のとおりです。
"latitude": 47.20296790272209,
"longitude": -123.41670367098749,
"timezone": "America/Los_Angeles",
"currently": {
"time": 1453402675,
"summary": "Rain",
"icon": "rain",
"nearestStormDistance": 0,
"precipIntensity": 0.1685,
"precipIntensityError": 0.0067,
"precipProbability": 1,
"precipType": "rain",
"temperature": 48.71,
"apparentTemperature": 46.93,
"dewPoint": 47.7,
"humidity": 0.96,
"windSpeed": 4.64,
"windGust": 9.86,
"windBearing": 186,
"visibility": 4.3,
"cloudCover": 0.73,
"pressure": 1009.7,
"ozone": 328.35
まあ、明らかにそれはJSONのほんの重要な部分です。
誰かが私の間違いを見つけられますか?
'data'はnilですか、または' json'はnilですか? – Krunal
呼び出しが非同期であるためです。また、 'task.resume()'が見つからない。詳細情報と解決策を得るために、 "Swift + Async + Closure"を探す。 – Larme
いいえ、ちょうどnilを出力します...このコードではどこでtask.resume()を追加する必要がありますか? – user8206035