Невозможно преобразовать значение типа «[String: Any]» в ожидаемый тип аргумента «String». - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать приложение погоды в Swift без использования Podfiles, и я столкнулся с камнем преткновения в плане передачи словаря в качестве аргумента при разборе JSON.Функция определения местоположения выглядит следующим образом:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations[locations.count - 1]
    if location.horizontalAccuracy > 0 {
        locationManager.startUpdatingLocation()
        locationManager.delegate = nil
        print("longitude = \(location.coordinate.longitude), latitude = \(location.coordinate.latitude)")

        let latitude = String(location.coordinate.latitude)
        let longitude = String(location.coordinate.longitude)
        let params : [String : String] = ["lat" : latitude, "lon" : longitude, "appid" : APP_ID]
        getWeatherData(url: WEATHER_URL, parameters: params)

    }
}

Чтобы проанализировать JSON, я создал следующую функцию:

private func getWeatherData(url: String, parameters: [String : String]) {
    let JsonURLString:[String: Any] = ["url": WEATHER_URL, "parameters": parameters]
    print(JsonURLString)
    guard let url = URL(string: JsonURLString) else { return }
    URLSession.shared.dataTask(with: url) { ( data, response, err ) in
        DispatchQueue.main.sync {
            if let err = err {
                print("Failed to get data from url:", err)
                return
            }
            guard let data = data else { return }
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let city = try decoder.decode(WeatherData.self, from: data)
                self.weatherData.city = city.name
            } catch {
                print(error)
                self.cityLabel.text = "Connection issues"
            }
        }
    }.resume()
}

У меня ошибка: строка Cannot convert the value of type '[String: Any]' to expected argument type 'String' влиния guard let url = URL(string: JsonURLString) else { return }.Мне интересно, если я спустился в кроличью нору и, возможно, использую альтернативный подход.Я хотел использовать кодируемый в Swift 4, поскольку это должен быть более простой способ анализа JSON.Теперь в этом примере я не уверен.Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 26 апреля 2019

Попробуйте этот код.

JsonURLString - это объект типа [String: Any], а не тип String.Поэтому вам необходимо преобразовать его в объект типа String.

private func getWeatherData(url: String, parameters: [String : String]) {
   let JsonURLString:[String: Any] = ["url": WEATHER_URL, "parameters": parameters]
   print(JsonURLString)
   let urlString = JsonURLString["url"] as? String
   guard let url = URL(string: urlString!) else { return }
   URLSession.shared.dataTask(with: url) { ( data, response, err ) in
   DispatchQueue.main.sync {
      if let err = err {
          print("Failed to get data from url:", err)
          return
      }
      guard let data = data else { return }
       do {
           let decoder = JSONDecoder()
           decoder.keyDecodingStrategy = .convertFromSnakeCase
           let city = try decoder.decode(WeatherData.self, from: data)
           self.weatherData.city = city.name
         } catch {
           print(error)
           self.cityLabel.text = "Connection issues"
         }
      }
   }.resume()
}
...