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 letguard 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 打印“可选(数据)”,我怎样才能摆脱“可选”的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 打印请求给出 nil

使用LODOP打印控件时,总是会出现一个空白页,请问怎样才可以解决?

Alamofire 上传功能打印 responseJSON

iOS Swift 2 - 失败时的 Alamofire 打印响应值

如何在 swift 中在 alamofire 中打印错误 html?

从 Alamofire 请求中快速打印数据