2016-04-19 27 views
6

使用let _ = ...是否有任何用途?“让_ = ...”(让下划线相等)在Swift中有什么用处?

我看过What's the _ underscore representative of in Swift References?的问题和解答,我知道下划线can be used to represent a variable that isn't needed

这将使意义,如果我只需要一个元组的一个值作为从上面的链接的例子:

do { 
    let _ = try DB.run(table.create(ifNotExists: true) {t in 
     t.column(teamId, primaryKey: true) 
     t.column(city) 
     t.column(nickName) 
     t.column(abbreviation) 
     }) 

} catch _ { 
    // Error throw if table already exists 
} 

我不:

let (result, _) = someFunctionThatReturnsATuple() 

不过,我最近碰到this code来到如果我只删除let _ =,就不会得到任何编译器警告或错误。在我看来,这更简单,更具可读性。代码的作者写了a book and a blog about Swift。我知道作者并不是绝对可靠的,但它让我怀疑是否有某些我错过的东西。

+1

下面是一个例子,其中需要'_'的赋值以避免编译器警告未使用的结果:http:// stackoverflow。 COM/A /1187415分之32788209。 –

+1

简而言之,'let _ ='明确表示程序员想要忽略方法调用的结果。 – Sulthan

+0

分配给'_'时'let'似乎是可选的。博客作者这样做。 – vacawama

回答

6

你会得到一个编译器警告,如果该方法已被标记从developer documentation一个warn_unused_result

应用此属性的方法或函数声明可以让编译器发出警告时,方法或函数被调用而不使用其结果。

您可以使用此属性提供有关具有变异对象的非变更方法的错误用法的警告消息。

+0

因此,使用'let _ ='基本上会让编译器认为您使用的是结果,即使该方法标记了'warn_unused_result',也不会给出警告? – Suragch

+0

这是正确的,但是对于文档中提出的问题,这可能表示您正在错误地使用该方法。 – sbarow

+6

@Surag使用'let _ ='不是欺骗编译器,而是让它知道你知道应该使用这个值,但是你选择不使用它。 – Valentin

3

有时它是简单和更清洁的使用try?do-catch,当你调用一些罚球,但决定不处理任何错误。如果您按原样拨打try?,编译器会警告您未使用的结果,但这并不好。所以你可以使用_来放弃结果。

例子:

let _ = try? NSFileManager.defaultManager().moveItemAtURL(url1, toURL: url2) 
3

使用let _ = ...明确告诉您,在右边的表达式返回一个值,但你不关心它的编译器。

在方法标记为warn_unused_result的情况下,如果您不使用下划线,则编译器会发出警告。 (因为在某些情况下,不使用返回值可能是错误的)。

+0

非常好的解释。 – VSG24

相关问题