我正在尝试创建一个简单的天气应用程序来抓取用户的位置,并使用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
。你应该使用Swift类型Data
。要将NSData?
转换为Data?
,只需将as Data?
添加到变量声明的末尾。
此外,您的类型是可选的,但您无法传入可选类型,因此您需要打开它(在此示例中使用if let data = data { /* stuff here */}
):
func getAddressForLatLng(latitude: String, longitude: String) {
let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)")
let data = NSData(contentsOf: url! as URL) as Data? // <==== Added 'as Data?'
if let data = data { // <====== Added 'if let'
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
当你转换为Dictionary
类型时,编译器不知道你在说什么,因为Dictionary
是一个generic type。所以你需要施放到Dictionary<String, AnyObject>
或[String: AnyObject]
(它们是相同的)。
let nsdata = NSData()
let data = Data(referencing: nsdata)
https://developer.apple.com/documentation/foundation/data/2224197-init