Come si scartano gli optionals di Swift?

Come scartare correttamente sia gli optionals normali che impliciti?

Sembra esserci confusione in questo argomento e vorrei solo avere un riferimento per tutti i modi e il modo in cui sono utili.

Ci sono attualmente due modi per creare optionals:

var optionalString: String? var implicitOptionalString: String! 

Quali sono tutti i modi per scartarli entrambi? Inoltre, qual è la differenza tra l’utilizzo ! e ? durante lo srotolamento?

Ci sono molte somiglianze e solo una manciata di differenze.

(Normale) Optionals

  • Dichiarazione: var opt: Type?

  • Scompattazione infallibile: let x = opt!.property // error if opt is nil

  • Test in sicurezza dell’esistenza: if opt != nil { ... someFunc(opt!) ... } // no error

  • Scartare in modo sicuro tramite binding: if let x = opt { ... someFunc(x) ... } // no error

  • var x = opt?.property // x is also Optional, by extension sicuro: var x = opt?.property // x is also Optional, by extension

  • Valori nulli in modo sicuro di coalescenza: var x = opt ?? nonOpt var x = opt ?? nonOpt

Optionals implicitamente non imballati

  • Dichiarazione: var opt: Type!

  • Unwrapping non esplicito (implicito): let x = opt.property // error if opt is nil

    • Scartare involontariamente tramite assegnazione:
      let nonOpt: Type = opt // error if opt is nil

    • Scartare involontariamente tramite il passaggio dei parametri:
      func someFunc(nonOpt: Type) ... someFunc(opt) // error if opt is nil

  • Test in sicurezza dell’esistenza: if opt != nil { ... someFunc(opt) ... } // no error

  • var x = opt?.property // x is also Optional, by extension sicuro: var x = opt?.property // x is also Optional, by extension

  • Valori nulli in modo sicuro di coalescenza: var x = opt ?? nonOpt var x = opt ?? nonOpt

Dalla Beta 5 abbiamo anche il nuovo operatore di coalescenza (??):

 var a : Int? let b : Int = a ?? 0 

Se l’opzione è! = Nil è srotolata altrimenti viene utilizzato il valore a destra dell’operatore

Un tipo facoltativo indica che la variabile potrebbe essere nulla.

Esempio:

 var myString: Int? = 55 myString = nil 

Il punto interrogativo indica che potrebbe avere valore nullo.

Ma se affermi così:

 var myString : Int = 55 myString = nil 

Mostrerà l’errore.

Ora per recuperare il valore è necessario scartarlo:

 print(myString!) 

Ma se vuoi scartare automaticamente:

 var myString: Int! = 55 

Poi:

 print(myString) 

Non c’è bisogno di scartare. Spero che ti sarà d’aiuto.