Ios 将JSONObjectWithData的结果强制转换到字典时崩溃<;字符串,任意>;
应用程序在将JSON结果解析为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
时崩溃,但未进入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字典。现在,你要做的是技术上的工作,我认为这是一个错误。你可以考虑为这种行为设置雷达。同时,也应尽可能避免强制铸造