swiftでネットワーク通知を学ぶ
– URLSession でAPIを叩く(例:天気アプリでAPIから天気データを取得)
– JSONデータのデコード(Codable)
対象API
https://api.open-meteo.com/v1/forecast?latitude=35.6895&longitude=139.6917¤t_weather=true
データ
{ "latitude":35.6895, "longitude":139.6917, "generationtime_ms":0.234, "utc_offset_seconds":0, "current_weather":{ "temperature":28.3, "windspeed":5.2, "winddirection":90 } }
Swiftの場合だと、New Group で新規 Views, Modelsなどのディレクトリを作成する
– Views:画面用の SwiftUI View ファイルを入れる
– Models:JSON の Codable 構造体やデータモデルを入れる
models/Weather.swift
import Foundation struct WeatherResponse: Codable { let current_weather: CurrentWeather } struct CurrentWeather: Codable { let temperature: Double let windspeed: Double let winddirection: Double }
ContentView
import SwiftUI struct ContentView: View { @State private var temperature: String = "__" @State private var windspeed: String = "__" var body: some View { VStack(spacing: 20) { Text("東京の現在天気") .font(.title) Text("気温: \(temperature)°C") Text("風速: \(windspeed)m/s") Button("天気を取得") { fetchWeather() } } .padding() } func fetchWeather() { guard let url = URL(string: "https://api.open-meteo.com/v1/forecast?latitude=35.6895&longitude=139.6917¤t_weather=true") else { return } URLSession.shared.dataTask(with: url) { data, response, error in if let data = data { do { let decoded = try JSONDecoder().decode(WeatherResponse.self, from: data) DispatchQueue.main.async { self.temperature = String(decoded.current_weather.temperature) self.windspeed = String(decoded.current_weather.windspeed) } } catch { print("JSONデコードエラー: \(error)") } } else if let error = error { print("通信エラー: \(error)") } }.resume() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
うおおおおおおおお、何だこれは すげえ
ポイント
– URLSession.shared.dataTask で非同期に API を叩く
– Codable で JSON を Swift の構造体にデコード
– DispatchQueue.main.async で UI 更新
– @State で変数をバインドして、UI に表示