Comme nous l’avons déjà vu, les Optionnelles en Swift sont une manière élégante et efficace de représenter soit une valeur, soit pas de valeur du tout. Contrairement à ce que l’on pourrait penser les optionnelles sont une construction par dessus le langage Swift et non pas un élément du langage lui même. Laissez nous vous montrer pourquoi.
Tout d’abord allons regarder la définition du type Optional. Pour cela dans Xcode appuyez sur ⌘⇧O, et tapez « Optional ». Voici ce qu’il vous donne (Swift 2.1) :
public enum Optional : _Reflectable, NilLiteralConvertible {
case None
case Some(Wrapped)
// ...
}
Comme vous pouvez le voir, nous voyons qu’un type Optional est simplement un enum avec une value associé. Cette valeur a un type (Wrapped), qui est un type générique pour permettre de rendre optionnelle n’importe quoi. La syntaxe ? à la fin d’un type n’est autre q’un sucre syntaxique ajouté au langage pour rendre le code plus concis :
String?
// is equivalent to
Optional<String>
Les enums Swift montrent toute leur puissance ici car nous sommes capable d’implémenter un concept d’assez haut niveau, avec cette construction relativement simple. Maintenant regardons d’un peu plus près l’initialisation des optionnelles.
/// Construct a `nil` instance.
public init()
/// Construct a non-`nil` instance that stores `some`.
public init(_ some: Wrapped)
/// Create an instance initialized with `nil`.
public init(nilLiteral: ())
La première déclaration pour l’initialisation prend pas de valeur, tandis que la deuxième prend en paramètre une valeur. De plus comme les optionnelles adopte le protocole NilLiteralConvertable, nous pouvons aussi initialiser une variable optionnelle avec nil.
Ces trois de ces déclarations signifient la même chose :
let foo = Optional()
let foo: String? = nil
let foo: String? = .None
De même ceux ci veulent dire la même chose :
let foo = Optional("Hello")
let foo: String? = "Hello"
let foo: String? = .Some("Hello")
Conclusion
Comme vous pouvez le voir, derrière les optionnelles se cache en réalité une structure relativement simple qui consiste en un enum qui contient ou non une valeur.