Rilegatura opzionale
Swift 3 e 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Il codice let booleanValue = booleanValuerestituisce falseif booleanValueis nile il ifblocco non viene eseguito. In caso booleanValuecontrario nil, questo codice definisce una nuova variabile denominata booleanValuedi tipo Bool(invece di un'opzione, Bool?).
Il codice Swift 3 e 4 booleanValue(e il codice Swift 2.2 where booleanValue) valuta la nuova booleanValue: Boolvariabile. Se è vero, il ifblocco viene eseguito con la nuova booleanValue: Boolvariabile definita nell'ambito (consentendo all'opzione di fare nuovamente riferimento al valore associato all'interno del ifblocco).
Nota: è una convenzione di Swift denominare la costante / variabile associata allo stesso modo della costante / variabile opzionale come let booleanValue = booleanValue. Questa tecnica è chiamata ombreggiatura variabile . Potresti rompere con le convenzioni e usare qualcosa di simile let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue. Lo faccio notare per aiutare a capire cosa sta succedendo. Consiglio di utilizzare l'ombreggiatura variabile.
Altri approcci
Niente coalescenza
La coalescenza nulla è chiara per questo caso specifico
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Il controllo falsenon è così chiaro
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Nota: if !booleanValue ?? falsenon compila.
Forza scartare opzionale (evitare)
Lo scartamento forzato aumenta la possibilità che qualcuno apporti in futuro un cambiamento che compila ma si arresta in modo anomalo in fase di esecuzione. Pertanto, eviterei qualcosa del genere:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Un approccio generale
Sebbene questa domanda sull'overflow dello stack chieda specificamente come verificare se a Bool?è trueall'interno di ifun'istruzione, è utile identificare un approccio generale che si tratti di verificare se è vero, falso o combinare il valore non racchiuso con altre espressioni.
Man mano che l'espressione diventa più complicata, trovo l'approccio di associazione facoltativa più flessibile e più facile da capire rispetto ad altri approcci. Si noti che le opere di legame opzionali con qualsiasi tipo opzionale ( Int?, String?, ecc).