J'ai vu ce code sur le site Swift et divers articles ici et j'essaie de comprendre les bases. Comment cette ligne est-elle évaluée?
if let name = optionalName {
Je suis confus car ce n'est pas le nom == nom facultatif, il attribue la valeur, alors comment ce rapport est-il vrai et pourquoi n'est-il pas vrai lorsque vous remplacez par john appleseed par nil, car il sera toujours égal?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
la source
la source
if let
syntaxe est connue sous le nom de liaison facultative.Réponses:
Essentiellement, la ligne dit: "si vous pouvez laisser la nouvelle variable
name
égaler la version non facultative deoptionalName
, faites ce qui suit avec". Comme Martin l'a souligné, cela s'appelle la liaison facultative .Le seul but de celui-ci est de tester si une variable facultative contient une valeur réelle et de lier le formulaire non facultatif à une variable temporaire. C'est le moyen le plus sûr de "déballer" une option ou, en d'autres termes, d'accéder à la valeur contenue dans l'option. Il ne s'agit en aucun cas de test d'égalité d'aucune sorte. Il ne teste que l'existence d'une valeur dans un optionnel.
la source
if let
nous lions la valeur à une variable non facultative (name
dans cet exemple). Votre exemple ne serait pas compilé car il n'y a plus de variable appeléename
. Si vous avez changé votre exemple pour l'utiliser,optionalName
il s'imprimerait commeHello, Optional("John Appleseed")
. Vous pouvez utiliser le déballage forcé après avoir vérifié la valeur nulle,Hello, \(optionalName!)
mais c'est juste plus sujet aux erreurs si vous déplacez cette section de code quelque part sans vérification.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.
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é.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 //would not crash if you don't have a lead actor (optional chaining) let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)
Utiliser
if-let
(ouguard
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 uneelse
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
etif-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 } // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
la source
La syntaxe if accepte 2 conditions différentes. Le second, une liaison facultative, n'est pas un booléen. C'est déroutant, comme vous pouvez l'écrire:
if let name = optionalName {
mais non
if (let name = optionalName) {
Documentation Apple (référence Swift):
la source
if
ne prend que les expressions booléennes, à part cela, cela générerait une erreur, donc cet extrait de code disantif let name = optionalName { }else{ }
si optionalName est nul, la condition est fausse et l'instruction else s'exécutera. Cependant, si optionalName a une valeur, la valeur optionnelle est déroulée / affectée dans la variable constante, c'est-à-dire name.
la source
Chaque fois que vous travaillez avec des références faibles, des types optionnels, il serait préférable d'utiliser si vous permettez de protéger votre code et d'éviter les plantages Voici les exemples
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
la source