OpenWeatherMap и Swift 4 - PullRequest
       37

OpenWeatherMap и Swift 4

0 голосов
/ 09 декабря 2018

Я пытаюсь создать простое приложение погоды с использованием 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()

Это должно напечатать название города в консоли.К сожалению, он печатает ошибку.

1 Ответ

0 голосов
/ 09 декабря 2018

Вам нужно

let forecast = try JSONDecoder().decode(CurrentLocalWeather.self, from: data!)
print(forcast.name)

, поскольку корнем является словарь, а не массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...