在斯威夫特的捕获区前面有什么_下划线?

时间:2015-07-10 00:00:20

标签: swift swift2

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,所以转换是错误的,但为什么要使用_

2 个答案:

答案 0 :(得分:3)

您问的是有关自动转换的问题。这只是一个起点! Apple不知道你想做什么,所以他们提供了一个完全最小的中性catch-all catch块 - 它什么都不做,但我们编译因为有一个全能。显然,如果您希望捕获error变量,删除_并捕获error变量。您可能希望做更多事情,例如写一个更集中的catch块。 是建立在你给予的基础之上的。

答案 1 :(得分:2)

如果在catch块之前声明的变量未在下一个块中实际使用,则Xcode将自动将其转换为_,因为它未被使用。所以在上面的例子中,如果jsonError实际上没有在catch块中使用,Xcode可能会自动将其转换为_。这不仅适用于do {} catch {},还适用于if let ... { }等内容。

我认为因为它也可以转换为其他内容,例如if let ... {},如果他们不将_放在这些地方,代码就不会真正起作用。因此,尽管在某些地方你可能并不需要它,但它确实_到处都是安全的。