swift 4是否支持异常处理?
我的Swift程序正在崩溃,处理崩溃是他们的任何方式,我尝试了异常处理我没有得到它,Swift 4是否支持异常处理,我想做的是我不希望我的应用程序崩溃 这是当我没有得到价格值时,我想要捕捉的代码swift 4是否支持异常处理?,swift,exception-handling,Swift,Exception Handling,我的Swift程序正在崩溃,处理崩溃是他们的任何方式,我尝试了异常处理我没有得到它,Swift 4是否支持异常处理,我想做的是我不希望我的应用程序崩溃 这是当我没有得到价格值时,我想要捕捉的代码 let srt = self.Coin[indexPath.row] as! NSDictionary var sr2=NSDictionary() var barr = NSArray() if srt.value(forKey: "Price") != nil{ do{
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")
}
}
并非所有的错误都能在Swift中捕获
do catch
块只能处理可丢弃函数抛出的错误,可丢弃函数的声明使用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
}
正如大卫所说,我会避免强制展开和强制铸造。
但是我宁愿使用守卫let
来避免厄运金字塔,而不是if 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
}
无论你选择什么。。。不要强行展开。不要强求尝试。不要强行施展。总有一天它会回来咬你。如果让barr=srt.value(forKey:Price)作为?NSArray{…}
可能是一个更安全的选择swift 4是否支持异常处理
否。但它支持对错误(而不是异常)执行重试捕获。阅读Swift电子书,一切都已解释。相关:另一个选择当然是避免可能的运行时错误,不做强制展开和强制转换,即使这意味着必须额外编写一两行代码。