在将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>
协议是否同时接受基元类型和对象类型,以及它失败的原因?
答案 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支持的所有类型。