gpt4 book ai didi

swift - JSON 不可转换为 void(Openweather map API)

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:21 27 4
gpt4 key购买 nike

我正在使用 Swift 调用 Openweather map API,我需要从响应中返回一个特定值作为字符串。

但是,当我尝试返回值时出现错误,因为 JSON 不可转换为字符串。

func callWeatherServ(name:String, completion:(Dictionary<String,AnyObject>) -> Void)
{
var baseUrl: String = "http://api.openweathermap.org/data/2.5/weather"

var url: String = "\(baseUrl)?q=\(name)"

let finalUrl: NSURL = NSURL(string: url)!

let session = NSURLSession.sharedSession()

let task = session.dataTaskWithURL(finalUrl, completionHandler: {data, response, error -> Void in
if error != nil
{
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}

var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as! NSDictionary
if err != nil
{
// If there is an error parsing JSON, print it to the console
println("JSON Error \(err!.localizedDescription)")
}

let json = JSON(jsonResult)
println("response is \(json) ")

var weathername = json["weather"][0]["main"]

if (weathername != nil)
{
return weathername

}
})
task.resume()
}

我明白了,因为我们使用了返回类型为 void 的闭包,所以我们应该使用完成处理程序。但我不知道我们该怎么做。

另外,如果我们将完成处理程序作为参数传递,我们如何调用该函数?

最佳答案

如果您想像示例中那样继续使用 SwiftyJSON,请按以下方法操作:

  • 将完成处理程序的类型从字典更改为 SwiftyJSON 使用的 JSON 类型。

  • 然后将您要“返回”的值包装在处理程序中。

  • 然后按照我的示例调用您的方法,并使用尾随闭包

swift 2

func callWeatherServ(name:String, completion:(object: JSON) -> Void) {
let baseUrl: String = "http://api.openweathermap.org/data/2.5/weather"
let url: String = "\(baseUrl)?q=\(name)"
if let finalUrl = NSURL(string: url) {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(finalUrl, completionHandler: {data, response, error -> Void in
if let error = error {
print(error.localizedDescription)
} else {
if let data = data {
let json = JSON(data: data)
print("response is \(json) ")
completion(object: json["weather"][0]["main"])
} else {
print("No data")
}
}
})
task.resume()
}
}

调用方法:

callWeatherServ("paris") { (object) in
// here you get back your JSON object
print(object)
}

请注意,您使用 NSJSONSerialization 和 SwiftyJSON 解析了两次数据,因此我删除了不必要的 NSJSONSerialization 部分。

原始 Swift 1 版本

func callWeatherServ(name:String, completion:(object: JSON) -> Void)
{
var baseUrl: String = "http://api.openweathermap.org/data/2.5/weather"

var url: String = "\(baseUrl)?q=\(name)"

let finalUrl: NSURL = NSURL(string: url)!

let session = NSURLSession.sharedSession()

let task = session.dataTaskWithURL(finalUrl, completionHandler: {data, response, error -> Void in
if error != nil
{
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}

var err: NSError?
let json = JSON(data: data, options: NSJSONReadingOptions.allZeros, error: &err)
println("response is \(json) ")

var weathername = json["weather"][0]["main"]

if (weathername != nil)
{
completion(object: weathername)

}
})
task.resume()
}

调用方法:

callWeatherServ("paris", completion: { (object) -> Void in
println(object) // "Clear"
})

关于swift - JSON 不可转换为 void(Openweather map API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32136049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com