我的Swift程序崩溃,处理崩溃是他们的任何方式,我尝试异常处理我没有得到它,swift 4支持异常处理,我想做的是我不希望我的应用程序被撞坏了
这是我想要捕获的代码,当我没有得到价格值
let srt = self.Coin[indexPath.row] as! NSDictionary
var sr2=NSDictionary()
var barr = NSArray()
if srt.value(forKey: "Price") != nil{
do{
barr = try srt.value(forKey: "Price") as! NSArray
if (barr.count>0) {
sr2 = barr[0] as! NSDictionary
}
} catch {
print("Price is empty")
}
}
答案 0 :(得分:1)
并非所有错误都可以在Swift中捕获。 do-catch
块只能处理throwable函数抛出的错误,其声明使用throws
关键字标记,并使用throw
关键字从这些函数内部显式抛出错误。
Swift中的所有其他错误都是无法捕获的,尤其是因强制解包,强制转换或强制尝试(try!
)而导致的运行时错误。当您使用!
强制某些内容时,您告诉编译器您知道自己在做什么,并且在发生错误时应该抛出运行时错误。
除非您绝对确定它们不会失败,或者您希望在开发阶段的早期发现编程错误,否则不应使用强制解包/强制转换。不要使用带有嵌套强制语句的无用do-catch
块,只需使用可选绑定来安全地转换/解包可选值。
此外,请勿在Swift中使用NSDictionary
和NSArray
,使用其原生等价物Dictionary
和Array
。您似乎在解析JSON,因此请使用[String:Any]
代替NSDictionary
和[[String:Any]]
而不是NSArray
。
if let srt = self.Coin[indexPath.row] as? [String:Any] {
if let barrs = srt["Price"] as? [[String:Any]], let barr = barrs.first {
let sr2 = barr
}
答案 1 :(得分:0)
正如大卫所说,我会避免用力展开和强迫施法。
但我不是使用if let
语句,而是使用guard let
来避免厄运金字塔,如下所示:
guard let srt = self.Coin[indexPath.row] as? [String:Any], let barr = srt["Price"] as? [[String:Any]], let sr2 = barr.first as? [String:Any] else {
print("Price is empty")
//Need to return, throw or whatever
}
我们甚至可以删除你的中间变量,但它的可读性要低得多,如下:
guard let sr2 = ((self.Coin[indexPath.row] as? [String : Any])?["Price"] as? [[String : Any]])?.first as? [String : Any] else {
print("Price is empty")
//Need to return, throw or whatever
}
如果您更愿意使用if let
语句(如果您不想返回或引入guard
语句的else
条款),您也可以使用一个if
语句,就像那个
if let srt = self.Coin[indexPath.row] as? [String:Any], let barr = srt["Price"] as? [[String:Any]], let sr2 = barr.first {
//Do something with sr2
}
没有中间变量的较短版本:
if let sr2 = ((self.Coin[indexPath.row] as? [String:Any])?["Price"] as? [[String:Any]])?.first {
//Do something with sr2
}
无论你选择什么......不要强行打开包装。不要强迫尝试。不要强迫施法。有一天它会回来咬你。