2015-07-10 34 views
3

雨燕2.0增加do {} catch {}可以像这样使用:什么是Swift的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 _ { 

} 

什么使得它特别令人困惑的是为什么不只是提供完全没有问题的渔获之后:

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

} 

什么是下划线_,我能用它做什么,我将如何在我自己的函数签名中实现它?在之前的Swift 1.2声明中,我没有使用NSError,所以转换抛出错误但为什么使用_是合理的?

+1

@Aaron Brager如果你仔细阅读这两个问题,你会发现它们实际上没有关系,我的问题不是关于方法签名。 – Shizam

+0

想必它只是意味着你没有分配任何名称给你所捕获的错误,因此不会声明它。如果你实际上不想对catch块中的错误做任何事情,那么这可能更可取。 – myles

+0

@myles多数民众赞成在我的想法,但如果是这种情况,你可以不提供任何东西后的catch语句,即它只是说'catch {'那么为什么它会转换为具有'_'? – Shizam

回答

2

您在提出有关自动转换的问题。这只是一个起点!苹果公司并不知道你想做什么,所以它们提供了一个完全最小的中立全捕获块 - 它什么都不做,但我们编译是因为它有一个全面的。显然如果你想要来捕获error变量,你的将会删除_并捕获error变量。您可能想要做更多,例如写一个更集中的catch块。这是高达建立在你给的基础上。

+0

这很有道理@matt,问题的一部分是“为什么不只是提供什么,而不是_?”这看起来好像有一些特殊的区别,看起来'_'和'(无)'是相同的。这仍然让我想知道为什么苹果让你以两种不同的方式完成同样的事情...... – Shizam

+1

@Shizam因为'_'实际上有用的其他地方。你可以在任何地方使用'_' *你可以声明一个变量。为什么“catch”块是规则的例外? – nhgrif

+1

@Shizam但你已经给出了答案。这里有一个区别:“nothing”让'error'变量到达catch块。 '_',正如在开关盒中一样,拖动错误_并阻止其进入catch块_。这是一个很小的catch块,它什么都不做。我相信,这就是我在我的回答中所说的话。 – matt

1

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

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

+0

这是基于意见的问题。他们只能以非法舆论为依据的答案。这个答案被标记为基于“我认为...”之后的评论被接受... – nhgrif

+0

@nhgrif这里的问题有两个方面“为什么它会这样转换它?”和“有什么区别btw _和(没有)”。虽然前者可能有助于(某些)推测后者不会,并且这澄清了那一点。 – Shizam

相关问题