【发布时间】:2017-01-16 18:45:53
【问题描述】:
我正在尝试创建一个简单的天气应用程序,该应用程序可以获取用户的位置并使用 Google Maps api 显示简单的天气数据。一切正常,除了我获取 JSON 并获取地址的部分。
func getAddressForLatLng(latitude: String, longitude: String) {
let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)")
let data = NSData(contentsOf: url! as URL)
let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary
if let result = json["results"] as? Dictionary {
if let address = result[0]["address_components"] as? Array {
let number = address[0]["short_name"] as! String
let street = address[1]["short_name"] as! String
let city = address[2]["short_name"] as! String
let state = address[4]["short_name"] as! String
let zip = address[6]["short_name"] as! String
weatherDisplay.text = "\(city),\(state)"
}
}
}
上线:
let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary
我收到此错误:
Cannot invoke 'jsonObject' with an argument list of type '(with: NSData?, options: JSONSerialization.ReadingOptions)'
我做错了什么?
【问题讨论】:
-
这里根本不需要使用 NSData(或 NSURL)。
let url = URL(string: ...),let data = Data(contentsOf: ...) -
问题是你将一个可选项传递给
JSONSerialization。您可以强制解包数据,例如JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary -
请注意,使用
NSData(contentsOf: url! as URL)(或 Swift 3 中的Data(contentsOf:))是个坏主意。这是一个同步调用,将冻结 UI 直到它完成。你真的应该重写它来使用 NSURLSession。 -
我很难理解为什么这被否决了。在集合和相关标签的范围内似乎是一个合法的问题。
-
@LukeVanIn 你为什么要使用allowFragments?你知道如果下载失败,强制解包会崩溃吗?