Alamofire打印“可选(数据)”,如何摆脱“可选”

时间:2017-11-26 03:52:37

标签: json swift alamofire swift4

我已经看过这篇文章了但是我找不到任何与最新版本的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语句,但这没有用。谢谢!

2 个答案:

答案 0 :(得分: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的值在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连接似乎已脱机。