Avant de pouvoir décrire les cas d'utilisation des options implicitement non enveloppées, vous devez déjà comprendre ce que sont les options et options optionnelles implicitement non enveloppées dans Swift. Si vous ne le faites pas, je vous recommande d'abord de lire mon article sur les options
Quand utiliser une option implicitement déballée
Il y a deux raisons principales pour lesquelles on créerait une option implicitement non emballée. Tout cela a à voir avec la définition d'une variable qui ne sera jamais accessible quand nil
sinon, le compilateur Swift vous forcera toujours à déballer explicitement un Facultatif.
1. Une constante qui ne peut pas être définie lors de l'initialisation
Chaque constante de membre doit avoir une valeur au moment où l'initialisation est terminée. Parfois, une constante ne peut pas être initialisée avec sa valeur correcte lors de l'initialisation, mais il peut toujours être garanti d'avoir une valeur avant d'être accessible.
L'utilisation d'une variable facultative permet de contourner ce problème car un facultatif est automatiquement initialisé avec nil
et la valeur qu'il contiendra éventuellement restera immuable. Cependant, il peut être difficile de déballer constamment une variable dont vous savez qu'elle n'est pas nulle. Les options implicitement non enveloppées offrent les mêmes avantages qu'une option, avec l'avantage supplémentaire de ne pas avoir à la déballer explicitement partout.
Un bon exemple de cela est lorsqu'une variable membre ne peut pas être initialisée dans une sous-classe UIView jusqu'à ce que la vue soit chargée:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Ici, vous ne pouvez pas calculer la largeur d'origine du bouton avant le chargement de la vue, mais vous savez que awakeFromNib
sera appelée avant toute autre méthode sur la vue (autre que l'initialisation). Au lieu de forcer la valeur à être explicitement dépliée de façon inutile dans toute votre classe, vous pouvez la déclarer comme facultative implicitement non enveloppée.
2. Lorsque votre application ne peut pas récupérer d'un être variable nil
Cela devrait être extrêmement rare, mais si votre application ne peut pas continuer à s'exécuter si une variable est nil
accessible, ce serait une perte de temps de s'embêter à la tester nil
. Normalement, si vous avez une condition qui doit absolument être vraie pour que votre application continue de fonctionner, vous utiliserez un assert
. Une option implicitement non enveloppée contient une assertion pour nil. Même alors, il est souvent bon de déballer l'option et d'utiliser une assertion plus descriptive si elle est nulle.
Quand ne pas utiliser une option implicitement déballée
1. Variables des membres calculées avec paresse
Parfois, vous avez une variable membre qui ne doit jamais être nulle, mais elle ne peut pas être définie sur la valeur correcte lors de l'initialisation. Une solution consiste à utiliser une option implicitement non enveloppée, mais une meilleure façon consiste à utiliser une variable paresseuse:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Désormais, la variable membre contents
n'est initialisée que lors du premier accès. Cela donne à la classe une chance d'entrer dans le bon état avant de calculer la valeur initiale.
Remarque: Cela peut sembler contredire # 1 d'en haut. Cependant, il y a une distinction importante à faire. Ce qui buttonOriginalWidth
précède doit être défini pendant viewDidLoad pour empêcher quiconque de modifier la largeur des boutons avant d'accéder à la propriété.
2. Partout ailleurs
Pour la plupart, les options implicitement non enveloppées doivent être évitées car si elles sont utilisées par erreur, l'intégralité de votre application se bloque lors de son accès nil
. Si vous n'êtes jamais sûr de savoir si une variable peut être nulle, utilisez toujours par défaut une optionnelle normale. Déballer une variable qui n'est jamais nil
certainement ne fait pas grand mal.
if someOptional
.