Swift 的 catch 块前面的 _ 下划线是什么?

What is the _ underscore in front of Swift's catch block?

Swift 2.0 添加了 do {} catch {} 可以像这样使用:

do {
    let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch let jsonError as NSError {
    print(jsonError);
}

但我也看到在我的 2.0 转换 类 中用下划线实现的捕获:

do {
    let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch _ {

}

特别令人困惑的是为什么不在 catch 之后不提供任何内容,这是完全有效的代码:

do {
    let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: []);
} catch {

}

下划线 _ 是什么,我可以用它做什么,如何在我自己的函数签名中实现它?在之前的 Swift 1.2 声明中,我没有使用 NSError,因此转换会丢弃错误是有道理的,但为什么要使用 _

您问的是关于自动转换的问题。这只是一个起点! Apple 不知道你想做什么,所以他们提供了一个完全最小的中性 catch-all catch 块——它什么都不做,但我们编译是因为有一个 catch-all。显然,如果您想要捕获error变量,您删除_并捕获error 多变的。您可能想做更多,例如写一个更有针对性的 catch 块。 要在你已获得的基础上继续努力。

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

等内容

我认为因为它也与其他东西一起转换,比如 if let ... {},如果他们不把 _ 放在这些地方,代码实际上就不会工作。因此它 _ 在任何地方都是安全的,即使在某些地方你可能实际上不需要它。