Swift 2.0添加了do {} catch {}
,可以这样使用:
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch let jsonError as NSError {
print(jsonError);
}
但我在我的2.0转换类中也看到了用下划线实现的catch:
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch _ {
}
是什么让它特别混乱,为什么不在catch之后提供任何东西,这是完全有效的代码:
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch {
}
什么是下划线_
,我能用它做什么,我将如何在我自己的函数签名中实现它?在之前的Swift 1.2声明中,我没有使用NSError
,所以转换是错误的,但为什么要使用_
?
答案 0 :(得分:3)
您问的是有关自动转换的问题。这只是一个起点! Apple不知道你想做什么,所以他们提供了一个完全最小的中性catch-all catch块 - 它什么都不做,但我们编译因为有一个全能。显然,如果您希望捕获error
变量,将删除_
并捕获error
变量。您可能希望做更多事情,例如写一个更集中的catch块。 你是建立在你给予的基础之上的。
答案 1 :(得分:2)
如果在catch块之前声明的变量未在下一个块中实际使用,则Xcode将自动将其转换为_
,因为它未被使用。所以在上面的例子中,如果jsonError实际上没有在catch块中使用,Xcode可能会自动将其转换为_
。这不仅适用于do {} catch {}
,还适用于if let ... { }
等内容。
我认为因为它也可以转换为其他内容,例如if let ... {}
,如果他们不将_
放在这些地方,代码就不会真正起作用。因此,尽管在某些地方你可能并不需要它,但它确实_
到处都是安全的。