Быстрые данные о погоде из Openweathermap API?

От openweathermap api я получаю ответ ниже.

{
  "cod":"200",
  "message":0,
  "cnt":40,
  "list":[
     {
        "dt":1587643200,
        "main":{
           "temp":289.78,
           "feels_like":283.61,
           "temp_min":289.03,
           "temp_max":289.78,
           "pressure":1014,
           "sea_level":1014,
           "grnd_level":1010,
           "humidity":41,
           "temp_kf":0.75
        },
        "weather":[
           {
              "id":804,
              "main":"Clouds",
              "description":"overcast clouds",
              "icon":"04d"
           }
        ],
        "clouds":{
           "all":94
        },
        "wind":{
           "speed":6.75,
           "deg":2
        },
        "sys":{
           "pod":"d"
        },
        "dt_txt":"2020-04-23 12:00:00"
     },
     {
        "dt":1587654000,
        "main":{
           "temp":289.66,
           "feels_like":284.44,
           "temp_min":289.34,
           "temp_max":289.66,
           "pressure":1013,
           "sea_level":1013,
           "grnd_level":1009,
           "humidity":47,
           "temp_kf":0.32
        },
        "weather":[
           {
              "id":803,
              "main":"Clouds",
              "description":"broken clouds",
              "icon":"04d"
           }
        ],
        "clouds":{
           "all":67
        },
        "wind":{
           "speed":5.9,
           "deg":357
        },
        "sys":{
           "pod":"d"
        },
        "dt_txt":"2020-04-23 15:00:00"
     }

Затем я пишу приведенный ниже код, чтобы получить данные о ветре для любого определенного дневного времени (дт). Я получаю jsonresponse в "списке" Any. Но я не могу получить данные о ветре. Я получаю error

«Значение типа Any» не имеет индексов».

Кроме того, я не могу понять, как я могу получить данные о ветре для dt=1587643200 и dt=1587654000 отдельно.

                           if let list = jsonresponse["list"] as? Any {
                               let wind = list["wind"] as? [String : Any],
                               print(wind)
                           }

person zamazingol    schedule 23.04.2020    source источник
comment
list явно является массивом, поэтому используйте его как таковой или гораздо лучшее решение, исследуйте и используйте вместо этого Codable   -  person Joakim Danielson    schedule 23.04.2020
comment
Привет, я привел список как [String: Any], но в этом случае я не могу получить содержимое списка. Я также пробовал [String : [String: Any]].   -  person zamazingol    schedule 23.04.2020
comment
Я сказал массив, а не словарь   -  person Joakim Danielson    schedule 23.04.2020
comment
Спасибо, вы правы, это массив. Я привел список как массив, и это сработало.   -  person zamazingol    schedule 24.04.2020


Ответы (1)


Это очень простой пример, этот ">вопрос похож на вашу проблему. Я хотел бы, чтобы вы узнали о протоколе Codable, чтобы упростить и улучшить свой код из-за этого способ супер жуткий.

let url = URL(string: "https://samples.openweathermap.org/data/2.5/history/city?id=2885679&type=hour&appid=b1b15e88fa797225412429c1c50c122a1")!
URLSession.shared.dataTask(with: url, completionHandler: {(data, response, error) in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    guard let httpResponse = response as? HTTPURLResponse,
        (200...299).contains(httpResponse.statusCode) else {
            print("Error with the response, unexpected status code: \(String(describing: response))")
            return
    }

    guard let data = data else {
        return
    }

    guard let dictionaryObj = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
        return
    }

    guard let list = dictionaryObj["list"] as? [[String: Any]] else {

        return
    }

    if let first = list.first, let wind = first["wind"] {
        print(wind)
    }
}).resume()
person 93sauu    schedule 23.04.2020
comment
Спасибо за ваш ответ, это тоже сработало, я тоже буду кодировать. - person zamazingol; 25.04.2020
comment
Пожалуйста, не забудьте отметить вопрос как ответ, спасибо - person 93sauu; 25.04.2020