Diciamo che ho una funzione che ritorna facoltativa. nil se l'errore e il valore se il successo:rapido, unwrapping opzionale, inversione se condizione
func foo() -> Bar? { ... }
posso utilizzare seguente codice per lavorare con questa funzione:
let fooResultOpt = foo()
if let fooResult = fooResultOpt {
// continue correct operations here
} else {
// handle error
}
Tuttavia ci sono alcuni problemi con questo approccio per qualsiasi codice non banale:
Gestione errori eseguita alla fine ed è facile perdere qualcosa. È molto meglio, quando il codice di gestione degli errori segue la chiamata di funzione.
Il codice di operazioni corretto è rientrato di un livello. Se abbiamo un'altra funzione da chiamare, dobbiamo indentare un'altra volta.
Con C di solito si potrebbe scrivere qualcosa di simile:
Bar *fooResult = foo();
if (fooResult == null) {
// handle error and return
}
// continue correct operations here
ho trovato due modi per raggiungere simile stile di codice con Swift, ma non mi piace neanche.
let fooResultOpt = foo()
if fooResult == nil {
// handle error and return
}
// use fooResultOpt! from here
let fooResult = fooResultOpt! // or define another variable
Se scriverò "!" ovunque, sembra solo un cattivo gusto per i miei gusti. Potrei introdurre un'altra variabile, ma anche questo non sembra buono. Idealmente mi piacerebbe vedere il seguente:
if !let fooResult = foo() {
// handle error and return
}
// fooResult has Bar type and can be used in the top level
Mi sono perso qualcosa nella specifica O c'è qualche altro modo di scrivere del buon codice Swift cercando?
Grazie, ma la soluzione non si discosta dalla sintassi if (lasciare value = x) {. ..} else {...} e ho tutti gli inconvenienti che ho menzionato nella domanda. – vbezhenar