À partir de la documentation d'Apple :
Vous pouvez utiliser
if
etlet
ensemble pour travailler avec des valeurs qui pourraient être manquantes. Ces valeurs sont représentées comme des options. Une valeur facultative contient une valeur ou contientnil
pour indiquer que la valeur est manquante. Écrivez un point d'interrogation (?
) après le type d'une valeur pour marquer la valeur comme facultative.
Pourquoi voudriez-vous utiliser une valeur facultative?
Réponses:
Une option dans Swift est un type qui peut contenir une valeur ou aucune valeur. Les options sont écrites en ajoutant un
?
à n'importe quel type:Les options (avec les génériques) sont l'un des concepts Swift les plus difficiles à comprendre. En raison de la façon dont ils sont écrits et utilisés, il est facile de se faire une mauvaise idée de ce qu'ils sont. Comparez l'option facultative ci-dessus à la création d'une chaîne normale:
D'après la syntaxe, il semble qu'une chaîne facultative soit très similaire à une chaîne ordinaire. Ce n'est pas. Une chaîne facultative n'est pas une chaîne avec un paramètre "facultatif" activé. Ce n'est pas une variété spéciale de String. Une chaîne et une chaîne facultative sont des types complètement différents.
Voici la chose la plus importante à savoir: une option est une sorte de conteneur. Une chaîne facultative est un conteneur qui peut contenir une chaîne. Un Int facultatif est un conteneur qui peut contenir un Int. Considérez une option comme une sorte de colis. Avant de l'ouvrir (ou "dérouler" dans la langue des options), vous ne saurez pas s'il contient quelque chose ou rien.
Vous pouvez voir comment les options sont implémentées dans la bibliothèque standard de Swift en tapant "Facultatif" dans n'importe quel fichier Swift et en cliquant dessus. Voici la partie importante de la définition:
Facultatif est juste un
enum
qui peut être l'un des deux cas:.none
ou.some
. Si c'est le cas.some
, il y a une valeur associée qui, dans l'exemple ci-dessus, serait leString
"Bonjour". Une option utilise Generics pour donner un type à la valeur associée. Le type d'une chaîne facultative ne l'est pasString
, c'estOptional
ou plus précisémentOptional<String>
.Tout ce que Swift fait avec les options est magique pour rendre la lecture et l'écriture de code plus fluide. Malheureusement, cela obscurcit la façon dont cela fonctionne réellement. Je vais passer en revue certaines des astuces plus tard.
Remarque: je vais beaucoup parler des variables facultatives, mais c'est bien de créer des constantes facultatives aussi. Je marque toutes les variables avec leur type pour faciliter la compréhension des types de types en cours de création, mais vous n'avez pas à le faire dans votre propre code.
Comment créer des options
Pour créer une option, ajoutez un
?
après le type que vous souhaitez encapsuler. Tout type peut être facultatif, même vos propres types personnalisés. Vous ne pouvez pas avoir d'espace entre le type et le?
.Utilisation des options
Vous pouvez comparer un facultatif pour
nil
voir s'il a une valeur:C'est un peu déroutant. Cela implique qu'une option est soit une chose, soit une autre. C'est nul ou c'est "Bob". Ce n'est pas vrai, le facultatif ne se transforme pas en quelque chose d'autre. Le comparer à nil est une astuce pour rendre le code plus facile à lire. Si un facultatif est égal à zéro, cela signifie simplement que l'énumération est actuellement définie sur
.none
.Seuls les optionnels peuvent être nuls
Si vous essayez de définir une variable non facultative sur nil, vous obtiendrez une erreur.
Une autre façon de voir les options est en complément des variables Swift normales. Ils sont la contrepartie d'une variable dont la valeur est garantie. Swift est un langage prudent qui déteste l'ambiguïté. La plupart des variables sont définies comme non optionnelles, mais parfois ce n'est pas possible. Par exemple, imaginez un contrôleur de vue qui charge une image à partir d'un cache ou du réseau. Il peut ou non avoir cette image au moment de la création du contrôleur de vue. Il n'y a aucun moyen de garantir la valeur de la variable image. Dans ce cas, vous devrez le rendre facultatif. Il commence au fur
nil
et à mesure que l'image est récupérée, le facultatif obtient une valeur.L'utilisation d'une option révèle l'intention du programmeur. Par rapport à Objective-C, où n'importe quel objet peut être nul, Swift a besoin que vous sachiez clairement quand une valeur peut être manquante et quand elle est garantie d'exister.
Pour utiliser une option, vous la "déballez"
Une option
String
ne peut pas être utilisée à la place d'une réelleString
. Pour utiliser la valeur encapsulée dans une option, vous devez la déballer. Le moyen le plus simple de déballer une option est d'ajouter un!
après le nom facultatif. C'est ce qu'on appelle le "déballage forcé". Il renvoie la valeur à l'intérieur de l'option (comme le type d'origine) mais si l'option estnil
, elle provoque un crash d'exécution. Avant de déballer, vous devez vous assurer qu'il y a une valeur.Vérification et utilisation d'une option
Parce que vous devez toujours vérifier zéro avant de déballer et d'utiliser une option, c'est un modèle courant:
Dans ce modèle, vous vérifiez qu'une valeur est présente, puis lorsque vous êtes sûr qu'elle l'est, vous forcez à la dérouler dans une constante temporaire à utiliser. Parce que c'est une chose courante à faire, Swift propose un raccourci en utilisant "if let". C'est ce qu'on appelle la "liaison facultative".
Cela crée une constante temporaire (ou variable si vous remplacez
let
parvar
) dont la portée se trouve uniquement entre les accolades de l'if. Parce que devoir utiliser un nom tel que "unwrappedMealPreference" ou "realMealPreference" est un fardeau, Swift vous permet de réutiliser le nom de variable d'origine, en créant un nom temporaire dans la portée du supportVoici du code pour démontrer qu'une variable différente est utilisée:
La liaison facultative fonctionne en vérifiant si l'option est égale à zéro. Si ce n'est pas le cas, il décompresse l'option dans la constante fournie et exécute le bloc. Dans Xcode 8.3 et versions ultérieures (Swift 3.1), essayer d'imprimer une option comme celle-ci entraînera un avertissement inutile. Utilisez les options
debugDescription
pour le désactiver:À quoi servent les options?
Les options ont deux cas d'utilisation:
Quelques exemples concrets:
middleName
ouspouse
dans unePerson
classeweak
propriétés dans les classes. La chose sur laquelle ils pointent peut être régléenil
à tout momentBoolean
Les optionnels n'existent pas dans Objective-C mais il existe un concept équivalent, renvoyant nil. Les méthodes qui peuvent renvoyer un objet peuvent retourner nil à la place. Cela signifie "l'absence d'un objet valide" et est souvent utilisé pour dire que quelque chose s'est mal passé. Il ne fonctionne qu'avec des objets Objective-C, pas avec des primitives ou des types C de base (énumérations, structures). Objective-C avait souvent des types spécialisés pour représenter l'absence de ces valeurs (
NSNotFound
ce qui est vraimentNSIntegerMax
,kCLLocationCoordinate2DInvalid
pour représenter une coordonnée invalide,-1
ou une valeur négative est également utilisée). Le codeur doit connaître ces valeurs spéciales, elles doivent donc être documentées et apprises pour chaque cas. Si une méthode ne peut pas prendrenil
comme paramètre, cela doit être documenté. Dans Objective-C,nil
était un pointeur tout comme tous les objets étaient définis comme des pointeurs, maisnil
pointait vers une adresse spécifique (zéro). Dans Swift,nil
est un littéral qui signifie l'absence d'un certain type.Comparé à
nil
Vous pouviez utiliser n'importe quelle option en tant que
Boolean
:Dans les versions plus récentes de Swift, vous devez utiliser
leatherTrim != nil
. Pourquoi est-ce? Le problème est qu'unBoolean
peut être enveloppé dans une option. Si vous avezBoolean
comme ça:il a deux sortes de "faux", un où il n'y a pas de valeur et un où il a une valeur mais la valeur est
false
. Swift déteste l'ambiguïté, vous devez donc toujours vérifier une optionnil
.Vous vous demandez peut-être à quoi
Boolean
sert une option ? Comme pour les autres options, l'.none
état pourrait indiquer que la valeur est encore inconnue. Il peut y avoir quelque chose à l'autre bout d'un appel réseau qui prend un certain temps à interroger. Les booléens facultatifs sont également appelés « booléens à trois valeurs »Astuces rapides
Swift utilise quelques astuces pour permettre aux options de fonctionner. Considérez ces trois lignes de code optionnel ordinaire;
Aucune de ces lignes ne doit être compilée.
String
les types sont différentsJe vais passer en revue certains des détails d'implémentation des options qui permettent à ces lignes de fonctionner.
Création d'une option
Utiliser
?
pour créer une option est du sucre syntaxique, activé par le compilateur Swift. Si vous voulez le faire à long terme, vous pouvez créer une option comme celle-ci:Cela appelle
Optional
le premier initialiseur de,public init(_ some: Wrapped)
qui déduit le type associé facultatif à partir du type utilisé entre parenthèses.La façon encore plus longue de créer et de définir une option:
Définir une option sur
nil
Vous pouvez créer une option sans valeur initiale ou en créer une avec la valeur initiale de
nil
(les deux ont le même résultat).Permettre aux optionnels d'être égaux
nil
est activé par le protocoleExpressibleByNilLiteral
(précédemment nomméNilLiteralConvertible
). L'option est créé avec laOptional
deuxième initialiseur de »,public init(nilLiteral: ())
. Les docs disent que vous ne devriez pas utiliserExpressibleByNilLiteral
quoi que ce soit, sauf les options, car cela changerait la signification de nil dans votre code, mais il est possible de le faire:Le même protocole vous permet de définir un optionnel déjà créé sur
nil
. Bien que ce ne soit pas recommandé, vous pouvez utiliser directement l'initialiseur littéral nil:Comparaison d'une option à
nil
Les options définissent deux opérateurs spéciaux "==" et "! =", Que vous pouvez voir dans la
Optional
définition. La première==
vous permet de vérifier si une option est égale à zéro. Deux options différentes qui sont définies sur .none seront toujours égales si les types associés sont les mêmes. Lorsque vous comparez à zéro, Swift crée en arrière-plan une option du même type associé, définie sur .none, puis l'utilise pour la comparaison.Le deuxième
==
opérateur vous permet de comparer deux options. Les deux doivent être du même type et ce type doit être conformeEquatable
(le protocole qui permet de comparer les choses avec l'opérateur régulier "=="). Swift (vraisemblablement) déballe les deux valeurs et les compare directement. Il gère également le cas où l'un ou les deux options sont.none
. Notez la distinction entre comparer aunil
littéral.De plus, il vous permet de comparer n'importe quel
Equatable
type à un habillage optionnel de ce type:Dans les coulisses, Swift encapsule le non-optionnel comme optionnel avant la comparaison. Cela fonctionne aussi avec les littéraux (
if 23 == numberFromString {
)J'ai dit qu'il y a deux
==
opérateurs, mais il y a en fait un troisième qui vous permet de mettrenil
sur le côté gauche de la comparaisonOptions de dénomination
Il n'y a pas de convention Swift pour nommer les types facultatifs différemment des types non facultatifs. Les gens évitent d'ajouter quelque chose au nom pour montrer qu'il s'agit d'un type facultatif (comme "optionalMiddleName" ou "possibleNumberAsString") et laisser la déclaration montrer qu'il s'agit d'un type facultatif. Cela devient difficile lorsque vous voulez nommer quelque chose pour contenir la valeur d'une option. Le nom "middleName" implique qu'il s'agit d'un type String, donc lorsque vous en extrayez la valeur, vous pouvez souvent vous retrouver avec des noms comme "actualMiddleName" ou "unwrappedMiddleName" ou "realMiddleName". Utilisez la liaison facultative et réutilisez le nom de la variable pour contourner ce problème.
La définition officielle
Extrait de "The Basics" dans le langage de programmation Swift :
Pour terminer, voici un poème de 1899 sur les options:
Hier, dans l'escalier,
j'ai rencontré un homme qui n'était pas là
Il n'était plus là aujourd'hui
Je souhaite, je souhaite qu'il s'en aille
Antigonish
Plus de ressources:
la source
if myString
ne compile plus. Vous en avez besoinif myString != nil
. Voir documentation .Prenons l'exemple d'un
NSError
, s'il n'y a pas d'erreur retournée, vous voudriez rendre facultatif le retour de Nil. Il ne sert à rien de lui attribuer une valeur s'il n'y a pas d'erreur.Cela vous permet également d'avoir une valeur par défaut. Vous pouvez donc définir une méthode par défaut si la fonction ne reçoit rien
la source
func isNil<T>(t: T?) -> Bool { return t == nil }
retourneratrue
même s'il existe une valeur facultative qui se trouvenil
dans l'expression.return x == 5
? Quelle est la particularité de 5?Vous ne pouvez pas avoir une variable qui pointe
nil
dans Swift - il n'y a pas de pointeurs et pas de pointeurs nuls. Mais dans une API, vous voulez souvent pouvoir indiquer soit un type spécifique de valeur, soit un manque de valeur - par exemple ma fenêtre a-t-elle un délégué, et si oui, qui est-ce? Les options sont le moyen sûr de type et de mémoire de Swift pour ce faire.la source
J'ai fait une courte réponse, qui résume la plupart des éléments ci-dessus, pour nettoyer l'incertitude qui était dans ma tête en tant que débutant:
Contrairement à Objective-C, aucune variable ne peut contenir zéro dans Swift, donc le type de variable facultatif a été ajouté (variables suffixées par "?"):
La grande différence est que les variables facultatives ne stockent pas directement les valeurs (comme le feraient les variables Obj-C normales), elles contiennent deux états : " a une valeur " ou " a nil ":
Cela étant, vous pouvez vérifier ces variables dans différentes situations:
En utilisant le "!" suffixe, vous pouvez également accéder aux valeurs qui les entourent, uniquement si elles existent . (c'est-à-dire qu'il n'est pas nul ):
C'est pourquoi vous devez utiliser "?" et "!" et ne pas les utiliser tous par défaut. (ce fut ma plus grande perplexité)
Je suis également d'accord avec la réponse ci-dessus: le type facultatif ne peut pas être utilisé comme booléen .
la source
Dans l'objectif C, les variables sans valeur étaient égales à «nul» (il était également possible d'utiliser des valeurs «nul» identiques à 0 et fausses), d'où la possibilité d'utiliser des variables dans les instructions conditionnelles (les variables ayant des valeurs sont identiques à «VRAI»). »et ceux sans valeur étaient égaux à« FAUX »).
Swift assure la sécurité du type en fournissant une «valeur facultative». c'est-à-dire qu'il empêche les erreurs formées d'affecter des variables de différents types.
Ainsi, dans Swift, seuls les booléens peuvent être fournis sur des instructions conditionnelles.
Ici, même si «hw» est une chaîne, elle ne peut pas être utilisée dans une instruction if comme dans l'objectif C.
Pour cela, il doit être créé comme,
la source
La valeur facultative vous permet de montrer l'absence de valeur. Un peu comme NULL en SQL ou NSNull en Objective-C. Je suppose que ce sera une amélioration car vous pouvez l'utiliser même pour les types "primitifs".
Extrait de: Apple Inc. «The Swift Programming Language». iBooks. https://itun.es/gb/jEUH0.l
la source
nil
est juste du sucre syntaxique pour la constante enumOptionalValue<T>.None
(oùT
est le type approprié au contexte dans lequel vous utiliseznil
).?
est un raccourci pourOptionalValue<T>.Some(T)
.Une option signifie que Swift n'est pas entièrement sûr si la valeur correspond au type: par exemple, Int? signifie que Swift n'est pas entièrement sûr que le nombre soit un Int.
1) Si vous êtes absolument sûr du type, vous pouvez utiliser un point d'exclamation pour forcer le déballage, comme ceci:
Si vous forcez le déballage facultatif et qu'il est égal à zéro, vous pouvez rencontrer cette erreur de plantage:
Ce n'est pas nécessairement sûr, alors voici une méthode qui pourrait empêcher le plantage si vous n'êtes pas certain du type et de la valeur:
2) L'option implicitement déballée
3) La déclaration du gardien
De là, vous pouvez continuer et utiliser la variable non encapsulée. Assurez-vous de ne forcer le déballage (avec un!) Que si vous êtes sûr du type de la variable.
la source
Quand j'ai commencé à apprendre,
Swift
il était très difficile de comprendre pourquoi cette option était facultative .Pensons de cette façon. Considérons une classe
Person
qui a deux propriétésname
etcompany
.Permet maintenant de créer quelques objets de
Person
Mais on ne peut pas passer
Nil
àname
Voyons maintenant pourquoi nous utilisons
optional?
. Considérons une situation où nous voulons ajouterInc
après le nom de l'entreprise comme leapple
seraapple Inc
. Nous devons ajouter leInc
nom de l'entreprise et l'imprimer.Étudions maintenant les raisons pour lesquelles l'option est mise en place.
Permet de remplacer
bob
partom
Et félicitations! nous avons bien géré
optional?
Les points de réalisation sont donc
nil
nil
.Merci ... Joyeux codage
la source
Permet d'expérimenter avec le code ci-dessous Playground . J'espère effacer l'idée de ce qui est facultatif et la raison de son utilisation.
la source
Depuis https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html :
Pour mieux comprendre, lisez le lien ci-dessus.
la source
Bien...
La principale différence est que le chaînage facultatif échoue correctement lorsque l'option est nulle, tandis que le déballage forcé déclenche une erreur d'exécution lorsque l'option est nulle.
Pour refléter le fait qu'un chaînage facultatif peut être appelé sur une valeur nulle, le résultat d'un appel de chaînage facultatif est toujours une valeur facultative, même si la propriété, la méthode ou l'indice que vous interrogez renvoie une valeur non optionnelle. Vous pouvez utiliser cette valeur de retour facultative pour vérifier si l'appel de chaînage facultatif a réussi (l'option facultative renvoyée contient une valeur) ou n'a pas réussi en raison d'une valeur nulle dans la chaîne (la valeur facultative renvoyée est nulle).
Plus précisément, le résultat d'un appel de chaînage facultatif est du même type que la valeur de retour attendue, mais enveloppé dans un facultatif. Une propriété qui renvoie normalement un Int renvoie un Int? lorsqu'il est accessible via un chaînage facultatif.
Voici un didacticiel de base détaillé, par Apple Developer Committee: Chaînage en option
la source
Une option dans Swift est un type qui peut contenir une valeur ou aucune valeur. Les options sont écrites en ajoutant un ? à tout type:
Vous pouvez vous référer à ce lien pour approfondir vos connaissances: https://medium.com/@agoiabeladeyemi/optionals-in-swift-2b141f12f870
la source
Voici une déclaration facultative équivalente dans Swift:
Cette déclaration crée une variable nommée middleName de type String. Le point d'interrogation (?) Après le type de variable String indique que la variable middleName peut contenir une valeur qui peut être une chaîne ou nil. Quiconque regarde ce code sait immédiatement que middleName peut être nul. C'est auto-documenté!
Si vous ne spécifiez pas de valeur initiale pour une constante ou variable facultative (comme illustré ci-dessus), la valeur est automatiquement définie sur zéro pour vous. Si vous préférez, vous pouvez définir explicitement la valeur initiale sur nil:
pour plus de détails sur le lien facultatif à lire ci-dessous
http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values
la source