Swift Language Scartare un facoltativo

Esempio

Per accedere al valore di un Opzionale, deve essere scartato.

È possibile scartare condizionatamente un Opzionale usando l'associazione opzionale e forzare scartare un Opzionale usando il ! operatore.

Lo srotolamento condizionato richiede in modo efficace "Questa variabile ha un valore?" mentre force unwrapping dice "Questa variabile ha un valore!".

Se imposti di scartare una variabile nil , il tuo programma genererà un risultato inaspettato nullo mentre scarterai un'eccezione opzionale e si bloccherà, quindi devi valutare attentamente se usi ! è appropriato.

var text: String? = nil
var unwrapped: String = text! //crashes with "unexpectedly found nil while unwrapping an Optional value"

Per lo srotolamento sicuro, è possibile utilizzare un'istruzione if-let , che non genererà un'eccezione o un arresto anomalo se il valore spostato è nil :

var number: Int?
if let unwrappedNumber = number {       // Has `number` been assigned a value?
    print("number: \(unwrappedNumber)") // Will not enter this line
} else {
    print("number was not assigned a value")
}

O una dichiarazione di guardia :

var number: Int?
guard let unwrappedNumber = number else {
    return
}
print("number: \(unwrappedNumber)")

Si noti che l'ambito della variabile unwrappedNumber trova all'interno unwrappedNumber if-let e all'esterno del blocco di guard .

Puoi concatenare la scartocciatura di molti optionals, questo è utile soprattutto nel caso in cui il tuo codice richieda più di una variabile per funzionare correttamente:

var firstName:String?
var lastName:String?

if let fn = firstName, let ln = lastName {
    print("\(fn) + \(ln)")//pay attention that the condition will be true only if both optionals are not nil.
}

Si noti che tutte le variabili devono essere scartate per passare correttamente il test, altrimenti non si avrebbe modo di determinare quali variabili sono state scartate e quali no.

Puoi concatenare le dichiarazioni condizionali usando i tuoi optionals immediatamente dopo averli scartati. Questo significa che non ci sono nested if - else statements!

var firstName:String? = "Bob"
var myBool:Bool? = false

if let fn = firstName, fn == "Bob", let bool = myBool, !bool {
    print("firstName is bob and myBool was false!")
}