2015-12-13 4 views
23

Sto cercando di scrivere il seguente blocco di codice in una sola linea di if let:Utilizzando "se lasciare che" con la logica "o" operatore

if let amount = datasource?.incrementForCount?(count) { 

     count += amount 
    } 

    else if let amount = datasource?.fixedIncrement { 
     count += amount 
    } 

quando provo qualcosa di simile:

if let amount = datasource?.incrementForCount?(count) || let amount = datasource?.fixedIncrement { 

     count += amount 
    } 

Ho ricevuto un errore in fase di compilazione.

Non credo che la clausola where sia possibile per questo caso.

È possibile combinare le due istruzioni if let in una singola ORed?

risposta

19

Provare a usare ?? operatore:

if let amount = datasource?.incrementForCount?(count) ?? datasource?.fixedIncrement 
{ 
    count += amount 
} 

è possibile combinare la 2 se lasciare che le dichiarazioni in una sola ORed?

E 'possibile avere diversi let dichiarazioni come

if let a = optionalA, b = optionalB { ... } 

E tutti dovrebbero restituire valore non-zero a passare.

Ma se anche si desidera utilizzare una condizione logica è:

  1. poteva essere solo quello
  2. Dovrebbe essere posto al primo posto, prima di ogni diamo dichiarazioni
+0

c'è una soluzione più pulita da utilizzare quando ci sono ulteriori condizioni di OR invece di nidificare ?? statuti dell'operatore? – JAHelia

+0

@JAHelia No. Si può avere una sola condizione logica in if statement (non 'where') e deve essere posizionata sul primo posto, prima di ogni istruzione' let'. – Avt

7

No, non è possibile OR due istruzioni if-let o anche un'istruzione if-let con una condizione non if-let, poiché ciò annullerebbe completamente lo scopo dell'istruzione if-let. if-let assicura che è possibile immettere solo il corpo dell'istruzione se l'opzione facoltativa può essere aperta correttamente nella variabile.

let str:String? = nil 
if let s = str || true { 
    //s is nil, yet you're still in the if-let body 
} 

Nell'esempio di cui sopra si sarebbe ancora entrare nel corpo facoltativa anche se s erano pari a zero, nel qual caso si dovrebbe ancora verificare se s è nullo o meno all'interno del corpo, rendendo il primo controllo if-let inutile.

Problemi correlati