web-dev-qa-db-fra.com

Swift décorations variables avec "?" (Point d'interrogation) et "!" (Point d'exclamation)

Je comprends que, dans Swift, toutes les variables doivent être définies avec une valeur et qu’en utilisant des options, nous pouvons définir une variable de sorte qu'elle soit définie sur nil au départ.

Ce que je ne comprends pas, c’est comment définir une variable avec un ! est en train de le faire, car j’avais l’impression que cela "déroule" une valeur optionnelle. Je pensais qu'en agissant de la sorte, vous garantissiez qu'il y avait une valeur à décompresser dans cette variable, ce qui explique pourquoi sur IBActions et telle que vous la voyez utilisée.

En termes simples, quelle est la variable initialisée lorsque vous faites quelque chose comme ceci:

var aShape : CAShapeLayer!

Et pourquoi/quand ferais-je cela?

103
Jason Renaldo

Dans une déclaration de type, le ! est similaire au ?. Les deux sont facultatifs, mais le ! est un " implicitement non enveloppé" "optionnel , ce qui signifie que vous n’avez pas à le dérouler pour accéder à la valeur (mais cela peut toujours être nul).

C'est fondamentalement le comportement que nous avons déjà eu dans objectif-c. Une valeur peut être nulle et vous devez la vérifier, mais vous pouvez également accéder directement à la valeur comme si elle n'était pas facultative ( avec la différence importante que si vous ne vérifiez pas la valeur néant, vous obtiendrez une erreur d'exécution)

// 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

Usage:

// 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
}
140
Jiaaro