我正在尝试创建一个简单的天气应用程序,该应用程序获取用户的位置并使用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)'
我做错了什么?
let url = URL(string: ...)
和let data = Data(contentsOf: ...)
来代替。 - Martin RJSONSerialization
。你可以强制解包数据,例如JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary
。 - Luke Van InNSData(contentsOf: url! as URL)
(或在Swift 3中使用Data(contentsOf:)
)是不好的做法。这是一个同步调用,并且会冻结UI,直到完成为止。您真的应该重写它以使用NSURLSession。 - Duncan CNSData
需要转换为Data
,而是对象需要被解包。强制解包数据会导致崩溃,正如你正确指出的那样,尽管代码在其他地方使用了强制解包也会崩溃。我使用allowFragments
是因为这是问题所使用的。通常情况下不需要这样做,因为大多数 JSON 将是一个对象或一个数组。 - Luke Van In