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 に表示