2016-04-19 26 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

相關問題