Decorazioni variabili rapide con "?" (punto interrogativo) e "!" (punto esclamativo)


106

Capisco che in Swift tutte le variabili devono essere impostate con un valore e che utilizzando gli optionals possiamo impostare una variabile su cui impostare nilinizialmente.

Quello che non capisco è cosa !sta facendo l' impostazione di una variabile con a , perché avevo l'impressione che questo "scartasse" un valore da un opzionale. Ho pensato che così facendo, stai garantendo che c'è un valore da scartare in quella variabile, motivo per cui su IBActions e simili lo vedi usato.

Quindi, in poche parole, qual è la variabile che viene inizializzata quando fai qualcosa del genere:

var aShape : CAShapeLayer!

E perché / quando dovrei farlo?


Faresti questo per dire che una variabile non è nulla dopo aver verificato questo fatto.
Matthias

Non penso che questo dovrebbe essere contrassegnato come duplicato. "Cos'è un optional?" non è la stessa domanda di "Qual è la differenza tra i due tipi di optional?" che è più o meno quello che è questa domanda
Jiaaro

@ Jiaaro anche in quel caso, ci sono già tonnellate di domande riguardanti gli optional, gli optional implicitamente scartati e simili. Puoi anche fare riferimento a questo: stackoverflow.com/questions/24272781/…
Jack

@JackWu Ok, ma sono abbastanza sicuro che questa domanda non fosse un duplicato quando è stata posta. (è stato chiesto un'intera settimana prima del tuo esempio, per esempio)
Jiaaro

@Jiaaro Hai fatto un buon punto, non ho notato che questo era più vecchio .. forse l'altro dovrebbe essere contrassegnato come un duplicato di questo invece ..
Jack

Risposte:


145

In una dichiarazione di tipo il !è simile al ?. Entrambi sono un optional, ma !è un optional " implicitamente scartato" , il che significa che non devi scartarlo per accedere al valore (ma può comunque essere nullo).

Questo è fondamentalmente il comportamento che avevamo già nell'obiettivo-c. Un valore può essere nullo e devi verificarlo, ma puoi anche accedere direttamente al valore come se non fosse un opzionale (con l'importante differenza che se non controlli zero otterrai un errore di runtime)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

Uso:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

7
Gli optionals implicitamente scartati sono descritti in una sezione dal nome appropriato che inizia a pagina 56 di The Swift Programming Language .
Caleb

@Caleb Ho aggiunto un collegamento alla sezione pertinente dei documenti online in cui ho menzionato gli optionals implicitamente scartati :)
Jiaaro

Ottima informazione, grazie. Generalmente amare la sicurezza che Swift ci sta imponendo finora, dovrebbe produrre molti meno bug :).
Jason Renaldo

@ Jiaaro: grazie mille per la condivisione. Rende l'utente a capire perfettamente con l'esempio sopra. !! :)
Esha

3
Penso che la frase " Questo è fondamentalmente il comportamento che avevamo già nell'obiettivo-c " possa confondere. In object-c si può accedere a un nilvalore e effettivamente "lavorare" con esso, accedere rapidamente a un opzionale implicitamente scartato mentre è nullo genererà un'eccezione di runtime.
Sascha Wolf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.