Ios 将JSONObjectWithData的结果强制转换到字典时崩溃<;字符串,任意>;

Ios 将JSONObjectWithData的结果强制转换到字典时崩溃<;字符串,任意>;,ios,swift,Ios,Swift,应用程序在将JSON结果解析为时崩溃,但未进入catch块: do { result = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String,Any> } catch let error1 as NSError

应用程序在将JSON结果解析为
时崩溃,但未进入catch块:

        do
        {
            result = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String,Any>
        }
        catch let error1 as NSError
        {
            result = nil
            print(error1)
        }
do
{
结果=尝试将NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.AllowFragments)作为!字典
}
将let error 1捕获为NSError
{
结果=零
打印(错误1)
}
而如果我将JSON结果强制转换为
,则效果良好:

        do
        {
            result = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String,AnyObject>
        }
        catch let error1 as NSError
        {
            result = nil
            print(error1)
        }
do
{
结果=尝试将NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.AllowFragments)作为!字典
}
将let error 1捕获为NSError
{
结果=零
打印(错误1)
}

协议不是同时接受基元类型和对象类型吗?那么为什么它会失败呢?

不要使用
任何


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

不要使用
Any


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

您崩溃的原因是您正在进行强制转换。Swift中的do/catch构造与其他语言中的异常不同,任何错误都会被捕获到catch块中。就你而言

NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
可以抛出错误,如果抛出错误,将调用catch块。相反,强制强制转换到字典不会在失败时抛出错误。最好是用if-let这样的包装:

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)
 }
do
{
让temp=try NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.AllowFragments)
如果let result=temp as?字典{
//对结果做点什么
}
否则{
//演员不能优雅地处理它
}
}
将let error 1捕获为NSError
{
结果=零
打印(错误1)
}

至于为什么转换为“String,AnyObject”有效而“String,Any”失败,我怀疑这与以下事实有关:最初,它是从JSON调用返回的NSDictionary。这些都作为“字符串,任意对象”连接到Swift字典。现在,你要做的是技术上的工作,我认为这是一个错误。你可以考虑为这种行为设置雷达。同时,建议尽量避免强制铸造。

碰撞的原因是强制铸造。Swift中的do/catch构造与其他语言中的异常不同,任何错误都会被捕获到catch块中。就你而言

NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
可以抛出错误,如果抛出错误,将调用catch块。相反,强制强制转换到字典不会在失败时抛出错误。最好是用if-let这样的包装:

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)
 }
do
{
让temp=try NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.AllowFragments)
如果let result=temp as?字典{
//对结果做点什么
}
否则{
//演员不能优雅地处理它
}
}
将let error 1捕获为NSError
{
结果=零
打印(错误1)
}
至于为什么转换为“String,AnyObject”有效而“String,Any”失败,我怀疑这与以下事实有关:最初,它是从JSON调用返回的NSDictionary。这些都作为“字符串,任意对象”连接到Swift字典。现在,你要做的是技术上的工作,我认为这是一个错误。你可以考虑为这种行为设置雷达。同时,也应尽可能避免强制铸造