Swift NSString到预期参数NSData
我有以下代码:Swift NSString到预期参数NSData,swift,nsdata,nsjsonserialization,Swift,Nsdata,Nsjsonserialization,我有以下代码: let urls : String = Baseurl+"lat="+latitude+"&lon="+longitude+"&APPID="+apiKey if let url = NSURL(string: urls) { do { let jsonResult = try NSString(contentsOfURL: url, usedEncoding: nil)
let urls : String = Baseurl+"lat="+latitude+"&lon="+longitude+"&APPID="+apiKey
if let url = NSURL(string: urls) {
do {
let jsonResult = try NSString(contentsOfURL: url, usedEncoding: nil)
do {
if let jsonRes = try NSJSONSerialization.JSONObjectWithData(jsonResult, options: []) as? NSDictionary {
print(jsonRes)
}
} catch let error as NSError {
print(error.localizedDescription)
}
但是这行有一个错误:如果让jsonRes=try…
。错误是:无法将“NSString”类型的值转换为预期的参数类型“NSData”
当我打印jsonResult时,我得到以下结果:
{
"coord":{
"lon":-0.13,
"lat":51.51
},
"weather":[
{
"id":501,
"main":"Rain",
"description":"moderate rain",
"icon":"10d"
}
],
"base":"stations",
"main":{
"temp":284.46,
"pressure":1023,
"humidity":76,
"temp_min":283.15,
"temp_max":285.15
},
"visibility":10000,
"wind":{
"speed":7.7,
"deg":220
},
"clouds":{
"all":75
},
"dt":1449755400,
"sys":{
"type":1,
"id":5093,
"message":0.0414,
"country":"GB",
"sunrise":1449734113,
"sunset":1449762690
},
"id":2643743,
"name":"London",
"cod":200
}
如何访问这些值?
NSData
对象,而不是字符串
替换
let jsonResult = try NSString(contentsOfURL: url, usedEncoding: nil)
与
并删除该尝试
我还应该注意,这并不是发出web请求的最佳方式,您应该使用NSURLSession
发出异步请求:
NSURLSession().dataTaskWithURL(NSURL(string: urls)!) { (data, response, error) -> Void in
if let data = data {
do {
let dict = try NSJSONSerialization.JSONObjectWithData(data, options: [])
print(dict)
} catch {
print(error)
}
}
}.resume()
NSJSONSerialization.JSONObjectWithData()
需要一个NSData
对象,而不是字符串
替换
let jsonResult = try NSString(contentsOfURL: url, usedEncoding: nil)
与
并删除该尝试
我还应该注意,这并不是发出web请求的最佳方式,您应该使用NSURLSession
发出异步请求:
NSURLSession().dataTaskWithURL(NSURL(string: urls)!) { (data, response, error) -> Void in
if let data = data {
do {
let dict = try NSJSONSerialization.JSONObjectWithData(data, options: [])
print(dict)
} catch {
print(error)
}
}
}.resume()
请使用if-let-data=data{
而不是if(data!=nil){
,这样您就可以避免强制展开数据。对于其他人来说,这是一个更好的示例(您的代码可以工作,但不必要强制展开)。修改后的代码更“快速”这只是我设置的一个快速示例。很酷,很抱歉挑三拣四,但是初学者可以从这里的示例中学习,并且额外的字符很少。我认为在if let
之后使用双开口大括号会出现键入/复制和粘贴错误。您能检查吗?修复了括号键入错误。如果let data=data,请使用{
而不是if(data!=nil){
这样可以避免强制展开数据。更好的示例适用于其他人(您的代码可以工作,但不需要强制展开)。修改后的代码更“快速”这只是我设置的一个快速示例。很酷,很抱歉挑三拣四,但是初学者可以从这里的示例中学习,额外的字符很少。我认为在if let
之后使用双开口大括号时存在键入/复制和粘贴错误。您可以检查吗?修复了括号中的键入错误。