Это довольно просто с Decodable
.
Это структуры, в которых пропущены ненужные клавиши
struct CurrentLocalWeather: Decodable {
let main: Main
let name: String
let sys: Sys
let weather: [Weather]
let wind: Wind
}
struct Main: Decodable {
let humidity: Int
let temp: Double
let tempMin, tempMax: Double
}
struct Sys: Decodable {
let sunrise: Date
let sunset: Date
}
struct Weather: Decodable {
let description: String
let icon: String
let main: String
}
struct Wind: Codable {
let speed: Double
let deg: Int
}
Чтобы получить значок, вам нужно второе задание данных, получениесинхронные данные - это очень плохая практика.
И несоответствие правилам именования в отношении чувствительности к регистру тоже очень плохая практика.
class ViewController: UIViewController {
var timer = Timer()
//Variables from Storyboard
@IBOutlet weak var temp: UILabel!
@IBOutlet weak var tempMin: UILabel!
@IBOutlet weak var tempMax: UILabel!
@IBOutlet weak var windSpeed: UILabel!
@IBOutlet weak var direction: UILabel!
@IBOutlet weak var humidity: UILabel!
@IBOutlet weak var mainDesc: UILabel!
@IBOutlet weak var desc: UILabel!
@IBOutlet weak var city: UILabel!
@IBOutlet weak var sunrise: UILabel!
@IBOutlet weak var sunset: UILabel!
@IBOutlet weak var icon: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Define URL for Weather Data
URLSession.shared.dataTask(with: URL(string: "https://api.openweathermap.org/data/2.5/weather?lat=51.05011&lon=-114.08529&appid=<APPID_REMOVED_FOR_POSTING_PURPOSE>&units=metric")!) { data, response, error in
guard let data = data else { print("Error:", error!); return }
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .secondsSince1970
let result = try decoder.decode(CurrentLocalWeather.self, from: data)
guard let weather = result.weather.first else { return }
DispatchQueue.main.async {
self.desc.text = weather.description
self.mainDesc.text = weather.main
let icon = weather.icon
URLSession.shared.dataTask(with: URL(string: "http://openweathermap.org/img/w/\(icon).png")!) { iconData, _ , _ in
if let data = iconData {
DispatchQueue.main.async {
self.icon.image = UIImage(data: data)
}
}
}.resume()
}
} catch {
print("JSON error:", error)
}
}.resume()
}
}