前提・実現したいこと
Swift5の環境でAlamofireを利用してOpenWeatherMapのAPIを叩いてクラスのプロパティに取ってきた値をセットしたいです。
- Alamofire: ver.5.0.0-rc.3'
発生している問題とソースコード
メインのViewControllerでWeatherインスタンスを作成してプロパティを呼び出しても更新されておらず、Weatherクラス内の初期化されている値が呼び出される。
GetWeather
1 2import Foundation 3import Alamofire 4 5class Weather { 6 7 var city: String = "" 8 var coord: [String: Double] = [:] 9 var weather: String = "" 10 var description: String = "" 11 var icon: String = "" 12 var tempreture: [String: Double] = [:] 13 14 15 init(city: String) { 16 self.city = city 17 } 18 19 // APIを叩いてデータを取得 20 func getWeatherData() { 21 22 AF.request("https://api.openweathermap.org/data/2.5/weather?q=(self.city)&APPID=XXXXXXXXXXXXXX") 23 .validate(statusCode: 200..<300) 24 .validate(contentType: ["application/json"]) 25 .responseJSON {response in 26 let data = response.value as! [String: Any] 27 let weather = data["weather"] as! NSArray 28 guard let weatherDetail = weather[0] as? [String: Any] else { 29 print("failed") 30 return 31 } 32 33 // ここで値をセットしているつもり 34 self.coord = data["coord"] as! [String: Double] 35 self.weather = weatherDetail["main"] as! String 36 self.description = weatherDetail["description"] as! String 37 self.icon = weatherDetail["icon"] as! String 38 self.tempreture = data["main"] as! [String: Double] 39 print(self.icon) // 想定した値が帰ってくる 40 } 41 } 42} 43
WeatherViewController
1 2import UIKit 3import Alamofire 4 5class WeatherViewController: UIViewController { 6 7 @IBOutlet weak var cityNameLabel: UILabel! 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 let tokyo = Weather(city: "Tokyo") 11 tokyo.getWeatherData() // ここでプロパティが更新されている想定 12 print(tokyo.icon) // 空文字が帰ってくる 13 print(tokyo.coord) // [:]が帰ってくる 14 } 15} 16
試したこと
APIを使うのが今回で初なので予想なのですが、GetWeather関数が終わるのを待ってからViewControllerで呼び出さないといけないのかと思いました。
ちなみに
都市名"London"でAPIを叩くと以下のように取得されます。
{ "coord": { "lon": -0.13, "lat": 51.51 }, "weather": [ { "id": 300, "main": "Drizzle", "description": "light intensity drizzle", "icon": "09d" } ], "base": "stations", "main": { "temp": 280.32, "pressure": 1012, "humidity": 81, "temp_min": 279.15, "temp_max": 281.15 }, "visibility": 10000, "wind": { "speed": 4.1, "deg": 80 }, "clouds": { "all": 90 }, "dt": 1485789600, "sys": { "type": 1, "id": 5091, "message": 0.0103, "country": "GB", "sunrise": 1485762037, "sunset": 1485794875 }, "id": 2643743, "name": "London", "cod": 200 }
回答1件
あなたの回答
tips
プレビュー