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 ... {}
,如果他们不把 _
放在这些地方,代码实际上就不会工作。因此它 _
在任何地方都是安全的,即使在某些地方你可能实际上不需要它。
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 ... {}
,如果他们不把 _
放在这些地方,代码实际上就不会工作。因此它 _
在任何地方都是安全的,即使在某些地方你可能实际上不需要它。