2014-11-13 15 views
8

Cerco un modo per valutare uno Swift Bool conciso in un unico if dichiarazione, quando la Bool è la proprietà di un oggetto optional:Valutare Bool proprietà di oggetto opzionale in if

var objectWithBool: ClassWithBool? 
// ... 

if let obj = objectWithBool { 
    if obj.bool { 
     // bool == true 
    } else { 
     // bool == false 
    } 
} else { 
    // objectWithBool == nil 
} 

C'è sono un modo per combinare queste dichiarazioni if? In Objective-C questo potrebbe facilmente essere fatto, come oggetto nil può essere valutata nella stessa espressione:

if (objectWithBool.bool) { 
    // bool == true 
} else { 
    // bool == false || objectWithBool == nil 
} 

risposta

14

Ah, trovato:

if objectWithBool?.bool == true { 
    // objectWithBool != nil && bool == true 
} else { 
    // objectWithBool == nil || bool == false 
} 

L'espressione concatenamento opzionale objectWithBool?.bool restituisce un opzionale Bool . Poiché è facoltativo, tale espressione solo nella dichiarazione if verrà valutata su true/false in base al fatto che l'opzione contenga o meno un valore.

Utilizzando l'operatore == la dichiarazione if controlla il valore della facoltativa, che in questo caso può essere true, false o nil.

+0

non vorrei dire che *" forza la valutazione del Bool opzionale "*. 'objectWithBool? .bool' può essere' true', 'false' o' nil' ('== Opzionale .None'), e il confronto' == true' restituisce 'true' solo nel primo caso. –

+1

@MartinR Vero, sono stato un po 'frettoloso lì. Ho ampliato la spiegazione un po '- spero che abbia più senso ora. – Stuart

4

Un'altra possibile soluzione è:

if objectWithBool?.bool ?? false { 
    println("objectWithBool != nil && objectWithBool.bool == true") 
} else { 
    println("objectWithBool == nil || objectWithBool.bool == false") 
} 

Il "nil coalescing operator"a ?? b è una scorciatoia per

a != nil ? a! : b 
+0

Grazie a @MartinR. Mi piace l'operatore nil coalescente, può produrre un codice veramente accurato. Direi che qui è un po 'meno chiaro che controllare l'uguaglianza con 'true', dato che a prima vista la presenza di' false' potrebbe sembrare che la logica sia il contrario. Buona idea però! – Stuart

+0

@Stuart: Dipende da come lo guardi. Venendo da (semplice) C, preferisco 'if boolVar {}' a 'if boolVar == true {}' e quindi '?? false' funge da valore predefinito. E funziona in modo simile per altri tipi, ad esempio 'if (myArray? .count ?? 0)> 0'. - Quindi è solo questione di preferenze personali :) –

+0

Hai ragione, e preferisco anche "se boolVar {}" dove possibile. Suppongo che intendo che potrebbe essere fonte di confusione nel senso ingenuo che a prima vista si potrebbe erroneamente pensare che l'espressione stia verificando la presenza di _equality_ con 'false'. Probabilmente cambierò idea quando sarò più abituato a leggere l'operatore '?? :) :) – Stuart

0

Si potrebbe anche fare:

if let obj = objectWithBool where obj { 
    // objectWithBool != nil && obj == true 
} else { 
    // objectWithBool == nil || obj == false 
} 
+0

Questo è utile se hai bisogno di usare il' Bool' non imballato all'interno del blocco 'if', altrimenti devi scartare la variabile con 'se let _ = objectWithBool ...', o usa una delle altre risposte. Inoltre, notare che in Swift 3 la sintassi è cambiata in 'if let obj = objectWithBool, obj {...} else {...}' – Stuart

Problemi correlati