J'utilise Xcode 6 Beta 4. J'ai cette situation étrange où je ne peux pas comprendre comment tester correctement les options.
Si j'ai un xyz facultatif, est la bonne façon de tester:
if (xyz) // Do something
ou
if (xyz != nil) // Do something
Les documents disent de le faire de la première manière, mais j'ai trouvé que parfois, la deuxième méthode est requise et ne génère pas d'erreur de compilation, mais d'autres fois, la deuxième méthode génère une erreur de compilation.
Mon exemple spécifique utilise l'analyseur XML GData couplé à swift:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Ici, si je viens de le faire:
if xmlError
cela reviendrait toujours vrai. Cependant, si je fais:
if (xmlError != nil)
puis cela fonctionne (comme cela fonctionne en Objective-C).
Y a-t-il quelque chose avec le XML GData et la façon dont il traite les options qui me manquent?
Réponses:
Dans Xcode Beta 5, ils ne vous permettent plus de faire:
Cela produit une erreur:
Vous devez utiliser l'un de ces formulaires:
la source
Pour ajouter aux autres réponses, au lieu d'affecter à une variable nommée différemment à l'intérieur d'une
if
condition:vous pouvez réutiliser le même nom de variable comme ceci:
Cela peut vous éviter de manquer de noms de variables créatives ...
Cela tire parti de l' ombre variable prise en charge dans Swift.
la source
L'une des façons les plus directes d'utiliser les options est la suivante:
En supposant qu'il
xyz
est de type facultatif, commeInt?
par exemple.De cette façon, vous pouvez à la fois tester si
xyz
contient une valeur et si c'est le cas, travailler immédiatement avec cette valeur.En ce qui concerne votre erreur de compilation, le type
UInt8
n'est pas facultatif (notez pas de «?») Et ne peut donc pas être converti ennil
. Assurez-vous que la variable avec laquelle vous travaillez est facultative avant de la traiter comme telle.la source
Swift 3.0 et 4.0
Il existe principalement deux façons de vérifier facultatif pour nil. Voici des exemples avec comparaison entre eux
1. si loué
if let
est le moyen le plus simple de vérifier facultatif pour nil. D'autres conditions peuvent être ajoutées à cette vérification nulle, séparées par une virgule. La variable ne doit pas être nulle pour passer à la condition suivante. Si seule une vérification nulle est requise, supprimez les conditions supplémentaires dans le code suivant.À part cela, si ce
x
n'est pas nul, la fermeture if sera exécutée etx_val
sera disponible à l'intérieur. Sinon, la fermeture else est déclenchée.2. garde laisser
guard let
peut faire des choses similaires. Son objectif principal est de le rendre logiquement plus raisonnable. C'est comme dire Assurez-vous que la variable n'est pas nulle, sinon arrêtez la fonction .guard let
peut également faire une vérification de condition supplémentaire commeif let
.Les différences sont que la valeur non emballée sera disponible sur la même portée que
guard let
, comme indiqué dans le commentaire ci-dessous. Cela conduit aussi au point que la fermeture d' autre, le programme doit quitter la portée actuelle, parreturn
,break
etc.la source
À partir du guide de programmation rapide
La meilleure façon de procéder est donc
et si vous utilisez l'
xyz
instruction in if. Vous pouvez ensuite dérouler l'xyz
instruction if dans une variable constante. Ainsi, vous n'avez pas besoin de dérouler chaque endroit de l'instruction if oùxyz
est utilisé.Cette convention est suggérée par
apple
et elle sera suivie par les développeurs.la source
if xyz != nil {...}
.Bien que vous deviez toujours comparer explicitement un optionnel avec
nil
ou utiliser une liaison optionnelle pour extraire en plus sa valeur (c'est-à-dire que les options ne sont pas implicitement converties en valeurs booléennes), il convient de noter que Swift 2 a ajouté l'guard
instruction pour éviter la pyramide de malheur lorsque vous travaillez avec plusieurs valeurs facultatives.En d'autres termes, vos options incluent désormais la vérification explicite de
nil
:Reliure facultative:
Et
guard
déclarations:Notez comment une liaison facultative ordinaire peut entraîner une plus grande indentation lorsqu'il existe plusieurs valeurs facultatives:
Vous pouvez éviter cette imbrication avec des
guard
instructions:la source
nil
valeur, mais je suis d' accord que la courbe d'apprentissage est un peu raide. :)Extension du protocole Swift 5
Voici une approche utilisant l'extension de protocole afin que vous puissiez facilement intégrer une vérification facultative de nil:
Usage
la source
swift
analogue dupythonistas
qui essaie de garder le langage dans une forme de pureté pythonique. Ma prise? Je viens de mettre votre code dans mon mixin Utils.Vous pouvez maintenant faire rapidement la chose suivante qui vous permet de retrouver un peu de l'objectif-c
if nil else
la source
Au lieu de
if
, l'opérateur ternaire peut être utile lorsque vous souhaitez obtenir une valeur basée sur le fait que quelque chose est nul:la source
xyz == nil
l'expression ne fonctionne pas, maisx != nil
fonctionne. Je ne sais pas pourquoi.Une autre approche en plus d'utiliser des instructions
if
ouguard
pour effectuer la liaison facultative consiste à étendreOptional
avec:ifValue
reçoit une fermeture et l'appelle avec la valeur comme argument lorsque l'option n'est pas nil. Il est utilisé de cette façon:Vous devriez probablement utiliser un
if
ouguard
cependant car ce sont les approches les plus conventionnelles (donc familières) utilisées par les programmeurs Swift.la source
Une option qui n'a pas été spécifiquement couverte consiste à utiliser la syntaxe de valeur ignorée de Swift:
J'aime ça depuis que la vérification ne
nil
semble pas à sa place dans une langue moderne comme Swift. Je pense que la raison pour laquelle il ne semble pas à sa place est qu'ilnil
s'agit essentiellement d'une valeur sentinelle. Nous avons éliminé les sentinelles à peu près partout ailleurs dans la programmation moderne, alors nous avons l'nil
impression que cela devrait aussi aller.la source
Vous pouvez également utiliser
Nil-Coalescing Operator
Si
optionalValue
c'est le casnil
, il attribue automatiquement une valeur àdefaultValue
la source
Ce test a fonctionné comme prévu dans tous les cas. BTW, vous n'avez pas besoin des crochets
()
.la source
if (xyz != nil)
.Si vous avez des conditions conditionnelles et que vous souhaitez dérouler et comparer, que diriez-vous de profiter de l'évaluation de court-circuit de l'expression booléenne composée comme dans
Certes, ce n'est pas aussi lisible que certains des autres messages suggérés, mais fait le travail et est quelque peu succinct que les autres solutions suggérées.
la source