如何在Swift 3中将NSData转换为数据?

我正在尝试创建一个简单的天气应用程序来抓取用户的位置,并使用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?转换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是generics类型 。 所以你需要DictionaryDictionary[String: AnyObject] (它们是相同的)。

 let nsdata = NSData() let data = Data(referencing: nsdata) 

https://developer.apple.com/documentation/foundation/data/2224197-init