web-dev-qa-db-fra.com

Différence entre les options Force Unwrapping et les options Implicitly Unwrapped

J'étais très confus au sujet du déballage forcé et du déballage implicite au début. Maintenant, la compréhension suivante vient de mon auto-étude:

Il y a non action disponible pour le déballement implicite, mais il y a quelque chose appelé Optionals déballé implicitement. Les options optionnelles implicitement déballées et les options optionnelles normales sont toutes les deux des options, la différence étant lorsque vous accédez à une option implicitement non enveloppée, vous savez en toute confiance qu'il existe une valeur valide sous le capot et prête à l'emploi. Les options normales ont besoin de if let binding ou a déballage forcé (!) action pour accéder aux valeurs possibles derrière les variables optionnelles.

Résumé:

Déballage forcé est une action effectuée sur les options normales.

Optionnels déballés implicitement sont Optionnels, généralement utilisé pour l'initialisation de la classe et transmet les valeurs sans point d'exclamation lorsqu'il est utilisé.

Question:

Ai-je raison? Si ma compréhension n'est pas précise, je vous serais reconnaissant de bien vouloir me corriger.

Merci

24
SLN

Définissons tout d'abord un Facultatif

Une valeur facultative est un conteneur d'un certain type (Int, String, UIColor,. ..), il peut contenir la valeur (1, "Hello world", .greenColor(), ...) ou nil.

let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil

enter image description here

Quand en Swift nous voyons une valeur facultative nous pensons:

Ok, cela pourrait contenir la valeur réelle ou nil

Forcer le déballage

C'est l'action de extraire la valeur contenue dans un Optional. Cette opération est dangereuse car vous dites au compilateur: Je suis sûr que cette valeur facultative contient une valeur réelle, extrayez-la!

let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!

Maintenant, anInt contient la valeur 1.

enter image description here

Si nous effectuons un dépliage forcé sur une valeur facultative qui contient nil nous obtenons un fatalError, l'application se bloque et il n'y a aucun moyen de la récupérer.

let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!

fatal error: unexpectedly found nil while unwrapping an Optional value

enter image description here

Options optionnelles implicitement déballées

Lorsque nous définissons une option implicitement dépliée, nous définissons un conteneur qui effectuera automatiquement un débouclage forcé à chaque lecture.

var text: String! = "Hello"

Si maintenant nous lisons text

let name = text

nous n'obtenons pas un String facultatif mais un String simple parce que text déballe automatiquement son contenu.

Cependant, le texte est toujours facultatif, nous pouvons donc y mettre une valeur nil

text = nil

Mais dès que nous le lisons (et qu'il contient nil) nous obtenons une erreur fatale car nous déballons une option contenant nil

let anotherName = text

fatal error: unexpectedly found nil while unwrapping an Optional value
73
Luca Angeletti

Une option implicitement déballée est une option normale en arrière-plan, mais peut également être utilisée comme une valeur non optionnelle, donc oui, vous êtes correct.

Mais si vous déclarez une valeur implicitement dépliée, cela revient à la forcer à chaque utilisation.

Pour les options implicitement déballées, il y a 4 raisons principales de le faire.

1: une constante qui ne peut pas être définie lors de l'initialisation

2: Interagir avec une API Objective-C

3: Lorsque votre application ne peut pas récupérer d'une variable étant nil

4: NSObject Initialiseurs

5
Tarvo Mäesepp

Je dirais non, vous faites une fausse distinction:

  • La première moitié a raison; le déballage est certainement quelque chose que vous faites pour les options, et le déballage forcé est un moyen de le faire (une manière dangereuse).

  • Mais quant à ce qu'est un Option implicitement déballé: c'est un moyen de marquer un type Optionnel pour que le déballage forcé soit fait pour vous (si vous utilisez l'Optional dans un endroit où il ne peut pas être utilisé, mais pourrait être utilisé s'il était déballé).

2
matt