J'utilisais ceci dans mon application iPhone
if (title == nil) {
// do something
}
mais cela lève une exception, et la console montre que le titre est "(null)".
Donc j'utilise ceci maintenant:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
Quelle est la différence et quel est le meilleur moyen de déterminer si une chaîne est nulle?
ios
objective-c
cocoa-touch
Teo Choong Ping
la source
la source
Réponses:
Comme d'autres l'ont souligné, il existe de nombreux types de "null" sous Cocoa / Objective C. Mais une autre chose à noter est que [title isKindOfClass: [NSNull class]] est inutilement complexe puisque [NSNull null] est documenté comme singleton afin que vous puissiez simplement vérifier l'égalité des pointeurs. Voir Rubriques pour Cocoa: Utilisation de Null .
Un bon test pourrait donc être:
Notez comment vous pouvez utiliser le fait que même si title est nul, title.length renverra 0 / nil / false, c'est-à-dire 0 dans ce cas, vous n'avez donc pas à le cas particulier. C'est quelque chose auquel les nouveaux utilisateurs d'Objectif C ont du mal à s'habituer, en particulier à venir d'autres langages où les messages / méthodes d'appels à nil plantent.
la source
Map
la valeur d' un élément - qui estnull
dans Dart - ne correspond pas ànil
ouNULL
à l'Objectif C. La raison était qu'il s'agissait en faitNUNull null
, pas de la valeurNULL
nulle. Merci @PeterNLewis!c'est aussi simple que
rappelez-vous que dans l'objectif C, si l'objet est nul, il renvoie 0 comme valeur.
Cela vous donnera à la fois une chaîne nulle et une chaîne de longueur 0.
la source
object = @"";
ouobject = nil;
)Reportez-vous aux articles connexes suivants sur ce site:
Je pense que votre erreur est liée à autre chose car vous ne devriez pas avoir besoin de faire la vérification supplémentaire.
Voir également cette question connexe: Vérification correcte de la colonne de texte nil sqlite
la source
J'ai trouvé que pour vraiment faire les choses correctement, vous finissez par devoir faire quelque chose de similaire à
Sinon, vous obtenez des situations étranges où le contrôle contournera toujours votre chèque. Je n'en ai pas rencontré un qui dépasse les
isEqual
contrôles de longueur et de longueur.la source
Qu'est-ce que toutes ces réponses "fonctionne pour moi"? Nous codons tous dans la même langue et les règles sont
C'est ce qui fonctionnera pour tous. Si une solution donnée "fonctionne uniquement pour vous", c'est uniquement parce que le flux de votre application n'autorisera pas un scénario dans lequel la référence peut être nulle ou la longueur de la chaîne à 0. La bonne façon de procéder est la méthode qui gérera ce que vous voulez dans tous les cas.
la source
nil
(note: pas "null"), alors l'envoi d'un message, commelength
, produira 0 (ou la valeur 0 appropriée pour le type de retour de la méthode). C'est la règle de la langue. Il n'est pas nécessaire de vérifiernil
séparément dans ce cas.Si vous souhaitez tester tous les objets nil / vides (comme des chaînes vides ou des tableaux / ensembles vides), vous pouvez utiliser ce qui suit:
la source
Il existe deux situations:
Il est possible qu'un objet soit
[NSNull null]
, ou c'est impossible.Votre application ne devrait généralement pas
[NSNull null];
vous en servir uniquement si vous voulez mettre un objet " nul " dans un tableau ou l'utiliser comme valeur de dictionnaire. Et puis, vous devez savoir quels tableaux ou dictionnaires peuvent contenir des valeurs nulles et lesquels ne le sont pas.Si vous pensez qu'un tableau ne contient jamais de
[NSNull null]
valeurs, ne le vérifiez pas. S'il y a un[NSNull null]
, vous pouvez obtenir une exception mais c'est très bien: les exceptions Objective-C indiquent des erreurs de programmation. Et vous avez une erreur de programmation qui doit être corrigée en modifiant du code.Si un objet peut l' être
[NSNull null]
, vous le vérifiez simplement en testant(object == [NSNull null])
. AppelerisEqual
ou vérifier la classe de l'objet n'a pas de sens. Il n'y a qu'un seul[NSNull null]
objet, et l'ancien opérateur C le vérifie très bien de la manière la plus simple et la plus efficace.Si vous cochez un
NSString
objet qui ne peut pas être[NSNull null]
(parce que vous savez qu'il ne peut pas l'être[NSNull null]
ou parce que vous venez de vérifier qu'il est différent de[NSNull null]
, alors vous devez vous demander comment vous voulez traiter une chaîne vide, c'est-à-dire une chaîne de longueur 0. Si vous traiter c'est unenull
chaîne commenil
, alors(object.length == 0)
test.object.length renverra 0 siobject == nil
, donc ce test couvre les objets nuls et les chaînes de longueur 0. Si vous traitez une chaîne de longueur 0 différente d'une chaîne nulle, vérifiez simplement siobject == nil
.Enfin, si vous souhaitez ajouter une chaîne à un tableau ou à un dictionnaire et que la chaîne peut être nulle, vous avez le choix de ne pas l'ajouter, de la remplacer par
@""
ou de la remplacer par[NSNull null]
. Le remplacer par@""
signifie que vous perdez la capacité de faire la distinction entre "aucune chaîne" et "chaîne de longueur 0". Le remplacer par[NSNull null]
signifie que vous devez écrire du code lorsque vous accédez au tableau ou au dictionnaire qui vérifie les[NSNull null]
objets.la source
Vous ne vérifiez rien
ou
la source
Solution MACRO (2020)
Voici la macro que j'utilise pour une chaîne sûre au lieu d'obtenir une chaîne " (null) " sur un UILabel par exemple:
disons que vous avez une classe membre et une propriété de nom, et que le nom est nul:
avec macro:
agréable et propre?
Solution d'extension (2020)
Si vous préférez vérifier nil Null et chaîne vide dans votre projet, vous pouvez utiliser ma ligne d'extension ci-dessous:
NSString + Extension.h
NSString + Extension.m
Exemple d'utilisation
la source
la source
Essayez ceci pour vérifier null
la source
Cela fonctionnerait avec les cas suivants,
NSString *strOne = @""
OUNSString *strOne = @"StackOverflow"
OUNSString *strOne = [NSNull null]
OUNSString *strOne
.la source
Si ce genre de chose n'existe pas déjà, vous pouvez créer une catégorie NSString:
la source
Ce qui fonctionne pour moi c'est
if ( !myobject )
la source
NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
La vérification complète d'une chaîne pour les conditions nulles peut être la suivante: <\ br>
la source
Je ne vérifie qu'une chaîne nulle avec
la source
la source
la source
Pour la chaîne:
}
Reportez-vous à l'image ci-dessous:
la source
Pour la chaîne:
la source