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
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
Quand en Swift nous voyons une valeur facultative nous pensons:
Ok, cela pourrait contenir la valeur réelle ou
nil
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.
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
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
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
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é).