2016-04-19 21 views
6

L'utilizzo di let _ = ... non ha alcun scopo?Does "let _ = ..." (let underscore equal) ha qualche utilità in Swift?

Ho visto domande e risposte per What's the _ underscore representative of in Swift References? e so che il trattino di sottolineatura can be used to represent a variable that isn't needed.

Questo avrebbe senso se avevo bisogno di un solo valore di una tupla come nell'esempio dal link qui sopra:

let (result, _) = someFunctionThatReturnsATuple() 

Tuttavia, ho recentemente imbattuto this code:

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 
} 

I don ottenere eventuali avvisi o errori del compilatore se rimuovo semplicemente lo let _ =. Mi sembra che questo sia più semplice e più leggibile.

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

L'autore del codice ha scritto a book and a blog about Swift. So che gli autori non sono infallibili, ma mi chiedo se c'è qualcosa che mi manca.

+1

Ecco un esempio in cui è necessario assegnare a '_' per evitare un avvertimento del compilatore su un risultato non utilizzato: http: // stackoverflow. COM/a/32788209/1187415. –

+1

Insomma, 'let _ =' rende esplicitamente chiaro che il programmatore vuole ignorare il risultato della chiamata al metodo. – Sulthan

+0

Il 'let' sembra essere opzionale quando si assegna a' _'. L'autore del blog fa entrambe le cose. – vacawama

risposta

6

Si otterrà un avviso del compilatore se il metodo è stato segnato con un warn_unused_result dal developer documentation:

Applicare questo attributo per una dichiarazione di metodo o una funzione di avere il compilatore emette un avviso quando il metodo o la funzione viene chiamato senza utilizzare il suo risultato.

È possibile utilizzare questo attributo per fornire un messaggio di avviso sull'utilizzo non corretto di un metodo di nonmuturazione con una controparte mutante.

+0

Quindi l'uso di 'let _ =' indurrebbe fondamentalmente il compilatore a pensare che stavi usando il risultato e anche se il metodo fosse stato contrassegnato con 'warn_unused_result' non sarebbe stato dato alcun avviso? – Suragch

+0

Quello è corretto, ma al punto fatto nei documenti potrebbe essere un'indicazione che stai usando il metodo in modo errato. – sbarow

+6

@Suragch Usando 'let _ =' non sta ingannando il compilatore ma piuttosto lasciandogli sapere che si sa che questo valore dovrebbe essere usato ma si è scelto di non usarlo. – Valentin

3

A volte è semplice e più pulito da usare try? di do-catch, quando si chiama qualcosa che getta, ma ha deciso di non gestire eventuali errori. Se si lascia la chiamata con try? così com'è, il compilatore ti avviserà in caso di risultati non utilizzati, il che non è positivo. Quindi puoi scartare i risultati usando _.

Esempio:

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

Utilizzando let _ = ... dice specificamente al compilatore che si sa che l'espressione a destra restituisce un valore, ma che non si cura su di esso.

Nei casi in cui il metodo è stato contrassegnato con warn_unused_result, se non si utilizza il trattino basso, il compilatore si lamenterà con un avviso. (Perché in alcuni casi potrebbe essere un errore non utilizzare il valore restituito.)

+0

Ottima spiegazione. – VSG24