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 = booleanValue
restituisce false
if booleanValue
is nil
e il if
blocco non viene eseguito. In caso booleanValue
contrario nil
, questo codice definisce una nuova variabile denominata booleanValue
di 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: Bool
variabile. Se è vero, il if
blocco viene eseguito con la nuova booleanValue: Bool
variabile definita nell'ambito (consentendo all'opzione di fare nuovamente riferimento al valore associato all'interno del if
blocco).
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 false
non è così chiaro
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Nota: if !booleanValue ?? false
non 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?
è true
all'interno di if
un'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).