質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

513閲覧

【Swift5】AlamofireでOpenWeatherMapのAPIを叩く際に読み取った値をプロパティに入れる方法

luansan_1

総合スコア5

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/11/22 16:25

前提・実現したいこと

Swift5の環境でAlamofireを利用してOpenWeatherMapのAPIを叩いてクラスのプロパティに取ってきた値をセットしたいです。

発生している問題とソースコード

メインの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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2019/11/23 18:05

viewへの反映をせずにプロパティをprint文で出力しようとして何も出ないということでしょうか。非同期処理については理解されていますでしょうか。
guest

回答1

0

ベストアンサー

クラスの作り方をCodableを用いて以下のように変えてみてはいかがでしょうか?

swift

1コード 2class Weather { 3 4let coord: Coord 5let Coord:Codable{ 6 let lon: String 7 let lat: String 8} 9let weather: [Weather] 10let Weather: Cobable { 11 let id: String 12 let main: String 13 let description: String 14 let icon: String 15} 16 17...(以下省略) 18} 19

投稿2019/11/23 01:16

KakeruMasuda

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問