###経緯
AlamofireとSwiftyJSONを用いて、OpenWeatherMapのAPIから天気を取得する機能を作っています。
最終的に、
Swift
1var weather:[String] 2 weather = getTodayWeatherData() 3 print("weather:\(weather)")
として、配列weatherにいくつかの気象情報を代入したいと考えています。
そこで、関数getTodayWeatherData()を作りました。
Swift
1func getTodayWeatherData() -> Array<String> { 2 print("Let's Start!") 3 var todayWeatherData:[String] = ["初期値"] 4 Alamofire.request("http://api.openweathermap.org/data/2.5/weather", parameters: ["q":"(地名)", "appid":"(自分のAPI Key)"]).responseJSON{response in 5 guard let object = response.result.value else{ 6 return 7 } 8 let json = JSON(object) 9 todayWeatherData.append(json["main"]["temp_max"].stringValue) 10 todayWeatherData.append(json["main"]["temp_min"].stringValue) 11 todayWeatherData.append(json["weather"][0]["main"].stringValue) 12 todayWeatherData.append(json["main"]["humidity"].stringValue) 13 print("todayWeatherData:\(todayWeatherData)") 14 } 15 return todayWeatherData 16} 17
###問題
実行すると、
Let's Start! weather:["初期値"] todayWeatherData:["初期値", "298.016", "298.016", "Rain", "97"]
とログが残りました。データの取得とJSONの扱い自体はなんとか正しくできていると思います。
また、ログの一番上に「Let' Start!」がprintされていることから、関数getTodayWeatherData()は正しいタイミングで呼び出されていると思います。
しかしその後printされたログの順番を見るに、
実際にweatherに代入された配列todayWeatherDataは、"初期値"のみが入った、気象情報の取得前の状態で、
APIから取得したデータは一番最後にtodayWeatherDataに追加されているように思います。
このままでは、配列weatherを用いることができません。
関数getTodayWeatherData()が「return」まで実行されたのちに、
次の行の処理(weather = getTodayWeatherData())が行われると期待していたため、どう直せばいいか見当がつかず困っています。
ご教授のほど、よろしくお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8, Swift3
http通信ができるようinfo.plistを編集し、ドメイン指定で例外処理をしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/25 12:36
2017/07/25 12:38