我已经看过这篇文章了但是我找不到任何与最新版本的Swift或Alamofire有关的内容。我是swift的新手,我正在尝试解析json文件,但它会继续打印Optional(*the data*)
。我知道这与未经检查的类型有关,但我无法弄清楚。
Alamofire.request("url", encoding: JSONEncoding.default)
.responseJSON { response in
//to get JSON return value
if let result = response.result.value {
let JSON = result as! [[String:Any]]
print(JSON[0]["price_usd"])
}
}
我还尝试了let JSON = result as! [[String:Any]]
行中的if语句,但这没有用。谢谢!
答案 0 :(得分:1)
问题不在于result
的展开,而是从Dictionary
检索内容的下标运算符始终是“可选的”。我建议你阅读The Swift Programming Language: The Basics: Optionals中的选项。另请参阅the Dictionary
overview documentation。
无论如何,你的例子,如果你真的得到一个字典数组,并且你想要从第一个字典的price_usd
键的下标运算符返回的可选值解包。因此,请使用if let
或guard let
来解包该可选项:
Alamofire.request("url", encoding: JSONEncoding.default)
.responseJSON { response in
guard let result = response.result.value as? [[String: Any]],
let usd = result.first?["price_usd"] as? Double else {
print("not found")
return
}
print(usd)
}
或者,如果price_usd
的值在JSON中存储为String
(即在其周围加上引号):
Alamofire.request("url", encoding: JSONEncoding.default)
.responseJSON { response in
guard let result = response.result.value as? [[String: Any]],
let string = result.first?["price_usd"] as? String,
let usd = Double(string) else {
print("not found")
return
}
print(usd)
}
注意,我已经刻意避免任何as!
强制解包,因为如果找不到密钥,应用程序会毫不客气地崩溃。另请注意,我已经删除了[0]
下标运算符,如果数组为空,它将崩溃)而是使用first
函数,并且可选链接。
答案 1 :(得分:0)
var errorUnwrapped: String?
errorUnwrapped = response.result.error?.localizedDescription
print(errorUnwrapped)
输出为:可选(“ Internet连接似乎处于脱机状态。”)
print(errorUnwrapped!)
输出为:Internet连接似乎已脱机。