将JSONObjectWithData的结果转换为Dictionary <string,any>时崩溃

时间:2015-12-16 16:36:33

标签: ios swift

在将JSON结果解析为<String,Any>时,应用程序崩溃但它没有进入catch块:

        do
        {
            result = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String,Any>
        }
        catch let error1 as NSError
        {
            result = nil
            print(error1)
        }

如果我将JSON结果转换为<String,AnyObject>,它可以正常工作:

        do
        {
            result = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String,AnyObject>
        }
        catch let error1 as NSError
        {
            result = nil
            print(error1)
        }

<Any>协议是否同时接受基元类型和对象类型,以及它失败的原因?

2 个答案:

答案 0 :(得分:2)

你崩溃的原因是你正在进行的强迫投射。 Swift中的do / catch构造不像其他语言中的异常那样工作,其中任何错误都将在catch块中捕获。在你的情况下

NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)

会抛出错误,如果抛出错误,将调用catch块。相反,如果失败,强制转换为Dictionary不会抛出错误。将演员表包装成if if like like会好得多:

do
{
    let temp = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) 

    if let result = temp as? Dictionary<String,AnyObject> {
        // Do something with the result
    }
    else {
        // cast failed handle it gracefully
    }
}
catch let error1 as NSError
{
    result = nil
    print(error1)
 }

现在为什么要转换为&#34; String,AnyObject&#34;适用于&#34; String,Any&#34;失败,我怀疑它与最初的事实有关,它是从你的JSON调用返回的NSDictionary。这些被桥接到Swift Dictionaries为&#34; String,AnyObject&#34;。现在,你要做的事情应该在技术上有效,我认为这是一个它没有的错误。您可以考虑为此行为提交雷达。与此同时,建议尽可能避免施力。

答案 1 :(得分:1)

不要使用Any

AnyObject涵盖了JSON支持的所有类型。