我正在尝试做,尝试,抓住这样:
do {
setQA = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject]
print(setQA)
}
catch _ {
setQA = nil
self.customAlert("Error")
}
我试图调用一个方法来使用UIAlertController,但它永远不会到达它。
这甚至没有通过尝试,我的应用程序崩溃与此错误:
Could not cast value of type '__NSCFDictionary' (0x1a1773968) to 'NSArray'
这是一个预期的错误,有时会发生在用户数据上,我只是不让我的应用程序崩溃并只显示警报
答案 0 :(得分:1)
do/try/catch
将捕获其他方法抛出的错误,但它不会捕获运行时异常,例如您从强制转发中获取。例如,如果data
是无效的JSON,则会抛出并捕获错误。在你的情况下,似乎JSON是有效的,但它是一个字典,而不是一个数组。
你想要像
这样的东西setQA = nil
do {
if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] {
setQA = json
print(setQA)
} else {
self.customAlert("Invalid response from server")
}
} catch _ {
self.customAlert("Error parsing JSON")
}
答案 1 :(得分:1)
实际上这来自你的代码的这一部分:
JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject]
你能做的就是这样:
结果代码将是这样的:
if let realData = data as? Data{
do {
if let setQA = try NSJSONSerialization.JSONObjectWithData( realData, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] {
//Check if the result is an Array
print(setQA)
}else if setQA = try NSJSONSerialization.JSONObjectWithData( realData, options: NSJSONReadingOptions.AllowFragments) as? [String : AnyObject] {
//Check if the result is a dictionnary
}
}
catch _ {
setQA = nil
self.customAlert("Error")
}
}else{
//Check if you have at least some data
self.customAlert("No data from server :(")
}
}
一般情况下,尽量避免使用! ;)