Я пытаюсь создать простое приложение погоды с использованием API OpenWeatherMap в Swift 4. Я могу анализировать данные Json в простых случаях, но у этого более сложная структура.
Это файл Json, APIвозвращает.
{"ordin ": {" LON ": 144,96," Lat ": - 37,81}," погода ": [{" ID ": 520," Main ":" Дождь ", "description": "осветительный дождь", "icon": "09n"}], "base": "station", "main": {"temp": 288.82, "pressure": 1019, "влажность": 100, "temp_min": 288,15, "temp_max": 289,15}, "видимость": 10000, "ветер": { "скорость": 4.1, "град": 200}, "облака": { "все": 90}, "дт": 1544284800, "SYS": { "тип": 1, "ID": 9548, "сообщение": 0,5221, "страна": "AU", "восход": 1544208677, "закат": 1544261597}, "id": 2158177, "name": "Melbourne", "cod": 200}
Я создал несколько структур для получения данных Json.
struct CurrentLocalWeather: Decodable {
let base: String
let clouds: Clouds
let cod: Int
let coord: Coord
let dt: Int
let id: Int
let main: Main
let name: String
let sys: Sys
let visibility: Int
let weather: [Weather]
let wind: Wind
}
struct Clouds: Decodable {
let all: Int
}
struct Coord: Decodable {
let lat: Double
let lon: Double
}
struct Main: Decodable {
let humidity: Int
let pressure: Int
let temp: Double
let tempMax: Int
let tempMin: Int
private enum CodingKeys: String, CodingKey {
case humidity, pressure, temp, tempMax = "temp_max", tempMin = "temp_min"
}
}
struct Sys: Decodable {
let country: String
let id: Int
let message: Double
let sunrise: UInt64
let sunset: UInt64
let type: Int
}
struct Weather: Decodable {
let description: String
let icon: String
let id: Int
let main: String
}
struct Wind: Decodable {
let deg: Int
let speed: Double
}
Чтобы использовать эти данные, это код, который я написал:
let url = "https://api.openweathermap.org/data/2.5/weather?q=melbourne&APPID=XXXXXXXXXXXXXXXX"
let objurl = URL(string: url)
URLSession.shared.dataTask(with: objurl!) {(data, response, error) in
do {
let forecast = try JSONDecoder().decode([CurrentLocalWeather].self, from: data!)
for weather in forecast {
print(weather.name)
}
} catch {
print("Error")
}
}.resume()
Это должно напечатать название города в консоли.К сожалению, он печатает ошибку.