as
utilizzato per l'upcasting e il casting del tipo su un tipo a ponte
as?
utilizzato per il casting sicuro, restituire zero se fallito
as!
usato per forzare il casting, crash se fallito
Nota:
as!
non è possibile eseguire il cast del tipo raw su opzionale
Esempi:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Esempio
var age: Int? = nil
var height: Int? = 180
Aggiungendo un ? subito dopo il tipo di dati si dice al compilatore che la variabile potrebbe contenere un numero o meno. Neat! Nota che non ha davvero senso definire costanti opzionali: puoi impostare il loro valore solo una volta e quindi potresti dire se il loro valore sarà nullo o meno.
Quando dovremmo usare "?" e quando "!"
diciamo che abbiamo un'app semplice basata su UIKit. abbiamo del codice nel nostro controller di visualizzazione e vogliamo presentarvi un nuovo controller di visualizzazione. e dobbiamo decidere di spingere la nuova visualizzazione sullo schermo utilizzando il controller di navigazione.
Come sappiamo, ogni istanza di ViewController ha un controller di navigazione delle proprietà. Se stai creando un'app basata sul controller di navigazione, questa proprietà del controller della vista principale della tua app viene impostata automaticamente e puoi usarla per spingere o far apparire i controller di visualizzazione. Se usi un singolo modello di progetto di app, non ci sarà un controller di navigazione creato automaticamente per te, quindi il controller di visualizzazione predefinito della tua app non avrà nulla archiviato nella proprietà navigationController.
Sono sicuro che hai già indovinato che questo è esattamente il caso di un tipo di dati opzionale. Se controlli UIViewController vedrai che la proprietà è definita come:
var navigationController: UINavigationController? { get }
Quindi torniamo al nostro caso d'uso. Se sai per certo che il tuo controller di visualizzazione avrà sempre un controller di navigazione, puoi andare avanti e forzare lo scartamento:
controller.navigationController!.pushViewController(myViewController, animated: true)
Quando metti un! dietro il nome della proprietà dici al compilatore che non mi interessa che questa proprietà sia opzionale, so che quando questo codice viene eseguito ci sarà sempre un archivio di valori, quindi tratta questo Opzionale come un normale tipo di dati. Beh, non è carino? Cosa succederebbe se non ci fosse un controller di navigazione per il tuo controller di visualizzazione? Se suggerisci che ci sarà sempre un valore memorizzato in navigationController era sbagliato? La tua app andrà in crash. Semplice e brutto come quello.
Quindi, usa! solo se sei sicuro al 101% che sia sicuro.
Che ne dici se non sei sicuro che ci sarà sempre un controller di navigazione? Quindi puoi usare? invece di!:
controller.navigationController?.pushViewController(myViewController, animated: true)
Cosa? dietro il nome della proprietà dice al compilatore che non so se questa proprietà contiene zero o un valore, quindi: se ha valore usalo, e altrimenti considera l'intera espressione zero. Effettivamente il? ti consente di utilizzare quella proprietà solo nel caso in cui sia presente un controller di navigazione. No se assegni di qualsiasi tipo o fusioni di qualsiasi tipo. Questa sintassi è perfetta quando non ti interessa se hai o meno un controller di navigazione e vuoi fare qualcosa solo se c'è.
Un enorme grazie a Fantageek