Попытка передать словарь как функцию в качестве параметра - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь передать словарь в качестве параметра в функцию. В настоящее время я создаю небольшое приложение погоды. Проблема, которую я имею, пытается получить и проанализировать данные JSON. Я уже делал приложение Weather и использовал Alamofire, но хочу отказаться от использования подфайлов. Функция для Alamofire следующая:

func getWeatherData(url: String, parameters: [String : String]) {
    Alamofire.request(url, method: .get, parameters: parameters).responseJSON {
        response in
        if response.result.isSuccess {
            print("Success! Got the weather data")
            let weatherJSON : JSON = JSON(response.result.value!)
            print(weatherJSON)
            self.updateWeatherData(json: weatherJSON)

        } else {
            print("Error \(String(describing: response.result.error))")
            self.cityLabel.text = "Connection Issues"
        }
    }
}

Теперь я хочу использовать кодируемый и декодер, чтобы иметь доступ к данным JSON. Проблема, с которой я сталкиваюсь, это установка переменной JSONURLString.

private func getWeatherData(url: String, parameters: [String : String]) {
    let JsonURLString:[String: String] = [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()
}

Я использую API от openweatherAPI . Ниже приведена функция, которая получает текущее местоположение.

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 из openweatherAPI. Любая помощь будет оценена.

1 Ответ

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

let JsonURLString:[String: String] должно быть разрешено JsonURLString:[String: Any], потому что ваши параметры уже являются словарем.

Правильная строка кода должна выглядеть так, как показано ниже

let JsonURLString:[String: Any] = ["url": WEATHER_URL, "parameters": parameters]

...