Alamofire 打印“可选(数据)”,我怎样才能摆脱“可选”
Posted
技术标签:
【中文标题】Alamofire 打印“可选(数据)”,我怎样才能摆脱“可选”【英文标题】:Alamofire prints "Optional(data)", how can I get rid of "Optional" 【发布时间】:2017-11-26 03:52:37 【问题描述】:我已经看过很多这篇文章,但我找不到任何与最新版本的 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 语句,但这没有帮助。谢谢!
【问题讨论】:
【参考方案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
的值以String
的形式存储在 JSON 中(即用引号括起来):
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
函数,带有可选的链接。
【讨论】:
【参考方案2】:var errorUnwrapped: String?
errorUnwrapped = response.result.error?.localizedDescription
print(errorUnwrapped)
输出是:可选(“Internet 连接似乎处于脱机状态。”)而
print(errorUnwrapped!)
输出是:Internet 连接似乎处于脱机状态。
【讨论】:
以上是关于Alamofire 打印“可选(数据)”,我怎样才能摆脱“可选”的主要内容,如果未能解决你的问题,请参考以下文章
使用LODOP打印控件时,总是会出现一个空白页,请问怎样才可以解决?
iOS Swift 2 - 失败时的 Alamofire 打印响应值