Un optionnel est défini ou non défini (ni nul ni nul) ... nous laissant avec une décision importante. "Comment devons-nous écrire notre code pour qu'il puisse fonctionner correctement pour les deux états?". La façon dont nous déballons l'option est ce qui en décide pour nous.
Il existe plusieurs approches que vous pouvez utiliser pour contrer une option non définie.
- Crash!
- La valeur par défaut est quelque chose - si elle n'a pas été définie.
- Échouer gracieusement, c'est-à-dire ne rien faire, mais aussi si la valeur a été définie, attribuez-la.
- Échouer gracieusement, c'est-à-dire ne rien faire, mais si la valeur a été définie ... faire quelque chose (c'est juste plus qu'une simple affectation).
Voici les 4 approches
L'utilisation du déballage forcé plantera si vous n'avez pas de valeur. Vous voudrez faire ceci si avoir cette valeur est d'une importance vitale, par exemple le titre d'un film (chaque film DOIT avoir un nom). !
est utilisé pour le déballage forcé.
movieTitle = movie.title!
L'utilisation de la fusion nil est une autre façon de vous donner plus de contrôle , ce qui signifie qu'elle ne plantera pas si la valeur n'est pas définie, ni ne `` ne la définira rien '' si elle n'est pas définie ... cela ferait ce que vous lui dites. pour faire, par exemple, il faudrait par défaut / définir le nom du film sur untitled_movie s'il n'y avait pas de nom défini. ??
est utilisé pour une fusion nulle.
var movieTitle = movie.title ?? "untitled_Movie"
L'utilisation du chaînage facultatif ne fera rien si vous n'avez pas de valeur et définira la valeur si vous avez une valeur. Vous faites cela pour quelque chose dont la valeur définie n'est pas d'une importance vitale, par exemple pour le nom de l'agent de votre acteur . ?
est utilisé pour le chaînage facultatif.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
Utiliser if-let
(ou guard
qui sont deux types différents de liaison facultative ) vous donnera plus de contrôle , il ne plantera pas si la valeur n'est pas définie. Si la valeur est définie, vous pouvez faire quelque chose. S'il n'est pas défini, vous pouvez ajouter une else
déclaration.
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
C'est le moyen le plus couramment utilisé pour déballer, car le déballage forcé est quelque peu déconseillé. Pour plus d'informations sur les raisons pour lesquelles il est déconseillé, voir ici . Pour une bonne comparaison entre guard
et if-let
voirguard vs. if-let
Note latérale:
La liaison facultative et le chaînage facultatif sont couramment utilisés ensemble:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}