Existe-t-il un moyen de vérifier les chaînes pour nil
et ""
dans Swift? Dans Rails, je peux utiliser blank()
pour vérifier.
J'ai actuellement ceci, mais cela semble exagéré:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
Réponses:
Si vous avez affaire à des chaînes optionnelles, cela fonctionne:
L'
??
opérateur de fusion nil renvoie le côté gauche s'il n'est pas nul, sinon il renvoie le côté droit.Vous pouvez également l'utiliser comme ceci pour renvoyer une valeur par défaut:
la source
Vous pouvez peut-être utiliser la clause if-let-where:
Swift 3:
Swift 2:
la source
fatal error: unexpectedly found nil while unwrapping an Optional value
mais ma constantestring
a une chaîne de données.if let string = string, !string.isEmpty { /* string is not blank */ }
guard let
est une alternative si vous souhaitez mettre fin au flux de contrôle sous l'instruction. Cependant, rien n'est déballé dans la clause where ici (le! Est une négation booléenne)Si vous utilisez Swift 2, voici un exemple que mon collègue a proposé, qui ajoute la propriété isNilOrEmpty sur les chaînes facultatives:
Vous pouvez ensuite utiliser isNilOrEmpty sur la chaîne facultative elle-même
la source
where Wrapped:
doit spécifier un protocole et non un type.isNilOrEmpty
àhasValue
(ou quelque chose comme ça) et d' inverser la logiqueEn utilisant le
guard
déclarationJ'utilisais Swift pendant un certain temps avant d'apprendre la
guard
déclaration. Maintenant, je suis un grand fan. Il est utilisé de la même manière que l'if
instruction, mais il permet un retour anticipé et permet simplement un code beaucoup plus propre en général.Pour utiliser guard lorsque vous vérifiez qu'une chaîne n'est ni nulle ni vide, vous pouvez effectuer les opérations suivantes:
Cela déballe la chaîne facultative et vérifie qu'elle n'est pas du tout vide. S'il est nul (ou vide), vous revenez immédiatement de votre fonction (ou boucle) et tout ce qui suit est ignoré. Mais si l'instruction de garde réussit, vous pouvez utiliser en toute sécurité votre chaîne non emballée.
Voir également
la source
nil
ou vide, on ne voudrait pas appelerprint(myString)
. Si vous aviez besoin de continuer l'exécution après anil
ou videString
, vous utiliseriezif let
plutôt queguard
.Avec Swift 5, vous pouvez implémenter une
Optional
extension pourString
type avec une propriété booléenne qui renvoie si une chaîne facultative n'a pas de valeur ou est vide:Cependant,
String
implémente laisEmpty
propriété en se conformant au protocoleCollection
. Par conséquent, nous pouvons remplacer la contrainte générique du code précédent (Wrapped == String
) par une plus large (Wrapped: Collection
) afin queArray
,Dictionary
etSet
également bénéficier de notre nouvelleisNilOrEmpty
propriété:Utilisation avec
String
s:Utilisation avec
Array
s:Sources:
la source
isNilOrEmpty
àisEmptyOrNil
pour qu'il corresponde au préfixe afin qu'il soit facilement trouvable via le même modèle pour la saisie semi-automatique. J'ai remarqué une plus grande adoption de cette extension par des collègues avec lesquels je travaille rien qu'en trouvant cela de cette façon.la source
Je sais qu'il y a beaucoup de réponses à cette question, mais aucune d'entre elles ne semble être aussi pratique que celle-ci (à mon avis) pour valider les
UITextField
données, ce qui est l'un des cas les plus courants d'utilisation:Vous pouvez simplement utiliser
Vous pouvez également ignorer
.trimmingCharacters(in:.whitespaces)
si vous ne considérez pas les espaces comme une chaîne vide ou l'utiliser pour des tests d'entrée plus complexes commela source
Je recommanderais.
map
applique l'argument de fonction si l'option est.Some
.La capture de terrain de jeu montre également une autre possibilité avec le nouveau Swift 1.2 si la liaison est optionnelle.
la source
Si vous souhaitez accéder à la chaîne de manière non facultative, vous devez utiliser la réponse de Ryan , mais si vous ne vous souciez que de la non-vacuité de la chaîne, mon raccourci préféré est
Puisque
==
fonctionne bien avec les booléens facultatifs, je pense que cela laisse le code lisible sans obscurcir l'intention originale.Si vous voulez vérifier le contraire: si la chaîne est
nil
ou""
, je préfère vérifier les deux cas explicitement pour montrer l'intention correcte:la source
SWIFT 3
Utilisez comme ceci sur une chaîne facultative:
la source
Swift 3 pour vérifier la chaîne vide de la meilleure façon
la source
Vous pouvez créer votre propre fonction personnalisée, si c'est quelque chose que vous espérez faire beaucoup.
la source
Solution Swift 3 Utilisez la valeur optionnelle non emballée et comparez la valeur booléenne.
la source
Utiliser isEmpty
Utilisation de allSatisfy
Utilisation d'une chaîne facultative
Référence: https://useyourloaf.com/blog/empty-strings-in-swift/
la source
Créez une extension de classe String:
Notez que cela retournera TRUE si la chaîne contient un ou plusieurs espaces. Pour traiter une chaîne vide comme "vide", utilisez ...
... au lieu. Cela nécessite Foundation.
Utilisez-le ainsi ...
la source
Swift 3 Cela fonctionne bien pour vérifier si la chaîne est vraiment vide. Parce que isEmpty renvoie true lorsqu'il y a un espace.
Exemples:
la source
Vous devriez faire quelque chose comme ceci:
if !(string?.isEmpty ?? true) { //Not nil nor empty }
Nil L'opérateur de coalescence vérifie si l'option n'est pas nulle, dans le cas où il n'est pas nul, il vérifie alors sa propriété, dans ce cas est vide. Parce que cette option peut être nil, vous fournissez une valeur par défaut qui sera utilisée lorsque votre option est nulle.
la source
Il s'agit d'une solution générale pour tous les types conformes au
Collection
protocole, qui comprendString
:la source
Lors du passage des valeurs de la base de données locale au serveur et vice versa, j'avais trop de problèmes avec les? Et les! Et autres.
J'ai donc créé un utilitaire Swift3.0 pour gérer les cas nuls et je peux presque totalement éviter les? Et! 'S dans le code.
Ex:-
Avant :
Après :
et quand il est nécessaire de vérifier une chaîne valide,
Cela m'a évité d'avoir à passer par la peine d'ajouter et de supprimer de nombreux? Et! Après avoir écrit du code qui a du sens.
la source
Utilisez l'opérateur ternaire (également appelé opérateur conditionnel
C++ forever!
):if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }
Le
stringA!
déballage forcé ne se produit que lorsquestringA != nil
, donc c'est sûr. La== false
verbosité est un peu plus lisible qu'un autre point d'exclamation!(stringA!.isEmpty)
.Personnellement, je préfère une forme légèrement différente:
if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }
Dans l'instruction ci-dessus, il est immédiatement très clair que le
if
bloc entier ne s'exécute pas lorsqu'une variable estnil
.la source
utile pour obtenir la valeur de UITextField et vérifier la
nil
&empty
chaîneVoici votre fonction (lorsque vous appuyez sur a
button
) qui obtient une chaîne de UITextField et fait d'autres chosesCela prendra en charge la
nil
valeur ainsi que laempty
chaîne.Cela a parfaitement bien fonctionné pour moi.
la source
À mon avis, la meilleure façon de vérifier la chaîne nulle et vide est de prendre le nombre de chaînes.
la source
vous pouvez utiliser cette fonction
la source
nil
lève pas d'exception car vous ne pouvez pas du tout passer dans cette fonction (sauf depuis objc, auquel cas il plantera effectivement).