如何在Swift 3中将NSData转换为数据?
我正在尝试创建一个简单的天气应用程序,该应用程序可以获取用户的位置并使用Google Maps api显示简单的天气数据.一切正常,除了这部分,我使用JSON并获取地址.
I'm trying to create a simple weather app that grabs the user's location and shows simple weather data using the Google Maps api. Everything is working, except for this part where I take the JSON and get the address.
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?
.
You need to change a couple things. First, you are using NSData
. You should be using the Swift type Data
. To convert from NSData?
to Data?
, just add as Data?
to the end of the variable declaration.
此外,您的类型是可选的,但是您不能传递可选的类型,因此需要解开它(在本示例中使用if let data = data { /* stuff here */}
):
Also, Your type is optional, but you can't pass in an optional type, so you need to unwrap it (using, in this example, 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)"
}
}
}
}
更新:
您需要更改的另一件事是:
Another thing you need to change is:
let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary
当您强制转换为类型Dictionary
时,编译器不知道您在说什么,因为Dictionary
是
When you cast to the type Dictionary
, the compiler does not know what you are talking about because Dictionary
is a generic type. So you need to cast to Dictionary<String, AnyObject>
or [String: AnyObject]
(They are the same).