Les optionals dans Swift

La particularité de Swift par rapport aux autres langages modernes est qu’il n’est pas possible d’affecter une valeur null ou nil à un objet ou à un type primitif.

Le but d’Optional (C’est le cas également dans Java), c’est d’avoir un type qui peut retourner une valeur ou non.

Ce cas, on le retrouve typiquement pour les attributs d’un ViewController dans lequel un composant ne peut avoir une valeur qu’au moment où l’objet est instantié, donc qui peut être null jusqu’à la création de l’objet.

Par analogie, on peut considérer un type optional comme une boîte qui soit peut contenir une valeur soit rien (ou nil). Etant donné que c’est un type particulier, effectuer une opération entre un type optional et un vrai type n’est pas autorisé.

Mais d’abord comment définit-on un type optional dans Swift?

La syntaxe est assez simple car il suffit de rajouter un point d’interrogation à la fin de la déclaration de la variable. Ainsi, la variable suivante est un Optional de type String, var monStringOptional:String?

Maintenant qu’on a vue comment on crée la boîte, voyons comment on l’ouvre.

La syntaxe est simple car il suffit de rajouter un point d’exclamation à la fin de la variable au moment où on l’utilise. Exemple : monOptional!, mais ceci peut être dangereux car dans le cas où il n’y a rien dans la boîte, une erreur fatal sera levée.

Avant d’utiliser cette opérateur, on doit être sûr que l’optional contient une valeur.

L’alternative à l’opérateur point d’exclamation est l’utilisation d’un if let. If let permet de contrôler l’existence d’une valeur dans l’optional et de proposer un alternative dans le cas contraire.

La convention utilisée par la plupart des développeurs est d’utiliser le même nom de variable pour la variable wrappée dans un optional et la variable unwrappé. Ainsi on peut avoir quelquechose comme suit :

var foo:String?
if let foo = foo {
     dosomethingWith(foo)
}

Une autre notion qu’il est essentiel de connaître aussi pour pouvoir travailler avec les Optional est la notion de chaînage d’Optional. Un exemple vaut mieux qu’un long discours : myOptional?.type, le type de cette valeur est un optional du type type.

Une autre façon de déclarer un optional est d’utiliser l’opérateur point d’exclamation. Oui, l’opérateur point d’exclamation peut être utilisé pour ouvrir un Optional, mais également pour en créer un. A la différence qu’un Optional créé avec un point d’exclamation est implicitement unwrappé. A utiliser donc uniquement dans le cas où on est certain que l’Optional contient une valeur.

Une notion qui n’est pas tout à fait lié à un Optional, mais qui en utilise les concepts, c’est l’opérateur de downcasting as? et as!.

Si dans Java, lorsqu’on itère sur une liste d’objet d’un type parent contenant des objets de deux types filles différents, pour faire la distinction entre les deux classes filles on utilise l’opérateur instanceOf et on cas ensuite l’objet avec le type de la classe fille.

Dans Swift, le casting se fait via l’opérateur as?, celui-ci retournant un Optional, il faut faire un contrôle avec if let avant de pouvoir utiliser la valeur qui est retourné. L’opérateur as! est à utiliser si l’on est certain du type de la valeur qui est retourné.

L’optional n’est au final pas un concept si compliqué que ça. C’est juste une nouvelle notion à comprendre, et pour comprendre, il faut juste se familiariser avec.