【问题标题】:Trying to pass a dictionary as in a function as a parameter尝试将字典作为函数作为参数传递
【发布时间】:2019-09-14 04:57:00
【问题描述】:

我正在尝试将字典作为函数中的参数传递。我目前正在构建一个小型天气应用程序。我遇到的问题是尝试获取和解析 JSON 数据。我之前做过一个天气应用程序并使用过 Alamofire,但我想放弃使用 podfile。 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)

    }
}

问题是上述函数不起作用,因为我无法从 openweatherAPI 解析JSON。任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift dictionary codable weather-api


    【解决方案1】:

    let JsonURLString:[String: String] 应该是 JsonURLString:[String: Any],因为你的参数已经是一个字典了。

    正确的代码行应该如下所示

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

    【讨论】:

    • 感谢 Duy。现在我在guard let url = URL(string: JsonURLString) else { return } 线上遇到了另一个错误。错误是Cannot convert value of type '[String : Any]' to expected argument type 'String'
    • 正确,您现在将 JsonURLString 设为 [String:Any],而不是 String。 let queryStringParams = [ "key1" : "value1", "key2" : "value2"] var queryStrings : [String] = [] for key in queryStringParams.keys { queryStrings.append(key + "=" + queryStringParams[key]!); } let url = "http://example.com?" + queryStrings.joined(separator: "&")
    • 以后试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2017-10-01
    • 2023-03-26
    • 2013-10-29
    • 2022-11-12
    • 2018-09-14
    • 2021-09-26
    相关资源
    最近更新 更多