In this tutorial I’ll cover how to fetch weather data with Swift 5 using the Open Weather API. Open Weather is great and free and you’ll need an account to complete this tutorial. I show how to set one up in the video. I also cover how to download and parse JSON data using Swift. I also cover how easy it is to convert JSON data using both the Codable and Decodable protocol. This knowledge will be very useful when I create a iPhone Weather app in my next video. All of the code follows below.
►► Get my Python Programming Bootcamp Series for $9.99 ( Expires April 8th ) : bit.ly/SavePython6
►► Highest Rated Python Udemy Course + 23 Hrs + 99 Videos + New Videos Every Week
Get the Course for $1 Up Until April 3rd by Becoming a Patreon Here
Code from the Video
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
import UIKit import Foundation let apiKey = "YOUR-API-KEY" let data: Data? = """ {"coord":{"lon":-80,"lat":40.44},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":41.5,"feels_like":36.81,"temp_min":37.4,"temp_max":45,"pressure":1021,"humidity":80},"visibility":16093,"wind":{"speed":3.04,"deg":79},"clouds":{"all":90},"dt":1585068301,"sys":{"type":1,"id":3510,"country":"US","sunrise":1585048554,"sunset":1585092969},"timezone":-14400,"id":5206379,"name":"Pittsburgh","cod":200} """.data(using: .utf8) struct Weather: Codable { var temp: Double? var humidity: Double? } struct WeatherMain: Codable{ let main: Weather } func decodeJSONData(JSONData: Data){ do{ let weatherData = try? JSONDecoder().decode(WeatherMain.self, from: JSONData) if let weatherData = weatherData{ let weather = weatherData.main print(weather.temp!) print(weather.humidity!) } } } struct WeatherData: Decodable { let list: [List] } struct Main: Decodable { let temp: Float let temp_max: Float let temp_min: Float let feels_like: Float let humidity: Float } struct Weather2: Decodable { let main: String let description: String let icon: String } struct List: Decodable { let main: Main let weather: [Weather2] } func decodeJSONForecast(JSONData: Data){ let response = try! JSONDecoder().decode(WeatherData.self, from: JSONData) for i in response.list { print("Temp : \(i.main.temp)") print("Temp Max : \(i.main.temp_max)") print("Temp Min : \(i.main.temp_min)") print("Feels Like : \(i.main.feels_like)") print("Humidity : \(i.main.humidity)") for j in i.weather { print("Main : \(j.main)") print("Description : \(j.description)") print("Icon : \(j.icon)") } } } func pullJSONData(url: URL?, forecast: Bool){ let task = URLSession.shared.dataTask(with: url!) { data, response, error in if let error = error { print("Error : \(error.localizedDescription)") } guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { print("Error : HTTP Response Code Error") return } guard let data = data else { print("Error : No Response") return } if (!forecast){ decodeJSONData(JSONData: data) } else { decodeJSONForecast(JSONData: data) } } task.resume() } let city: String = "Pittsburgh" let url = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=\(city)&appid=\(apiKey)&units=imperial") pullJSONData(url: url, forecast: false) let url2 = URL(string: "http://api.openweathermap.org/data/2.5/forecast?q=pittsburgh&appid=\(apiKey)&units=imperial") pullJSONData(url: url2, forecast: true) |
Leave a Reply