J'utilisais cela dans mon application iPhone
if (title == nil) {
// do something
}
mais cela jette 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?
Comme d'autres l'ont fait remarquer, il existe de nombreux types de "null" dans Cocoa/Objective C. Mais il convient également de noter que [title isKindOfClass: [NSNull class]] est inutilement complexe, car [NSNull null] est documenté comme étant un singleton afin que vous puissiez simplement vérifier l’égalité du pointeur. Voir Sujets pour Cocoa: Utiliser Null .
Donc, un bon test pourrait être:
if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";
Notez que vous pouvez utiliser le fait que même si title est nil, title.length retournera 0/nil/false, c’est-à-dire 0 dans ce cas, vous n’avez donc pas à le cas spécial. C'est une chose à laquelle les débutants en Objective C ont du mal à s'habituer, en particulier dans d'autres langues où les messages/appels de méthode à nil crash.
c'est aussi simple que
if([object length] >0)
{
// do something
}
rappelez-vous que dans Objective C si object est null, il retourne 0 comme valeur.
Cela vous donnera une chaîne nulle et une chaîne de longueur 0.
Reportez-vous aux articles connexes suivants sur ce site:
Je pense que votre erreur est liée à quelque chose d'autre car vous ne devriez pas avoir à faire la vérification supplémentaire.
Voir également cette question connexe: Vérification correcte de la colonne de texte NULL sqlite
Quoi avec tous ces "fonctionne pour moi des réponses"? 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 "ne fonctionne que pour vous", c'est uniquement parce que votre flux d'application ne permet pas un scénario dans lequel la référence peut être nulle ou la longueur de la chaîne être égale à 0. La méthode appropriée consiste à gérer la méthode ce que vous voulez dans tous les cas.
J’ai constaté que pour bien faire les choses, il faut faire quelque chose de similaire à
if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}
Sinon, vous obtenez des situations étranges où le contrôle contournera toujours votre chèque. Je n'en ai trouvé aucun qui permette de dépasser la isEqual
et les vérifications de longueur.
Si vous souhaitez tester tous les objets nil/vides (comme les chaînes vides ou les tableaux/ensembles vides), vous pouvez utiliser les éléments suivants:
static inline BOOL IsEmpty(id object) {
return object == nil
|| ([object respondsToSelector:@selector(length)]
&& [(NSData *) object length] == 0)
|| ([object respondsToSelector:@selector(count)]
&& [(NSArray *) object count] == 0);
}
Il y a deux situations:
Il est possible qu'un objet soit _[NSNull null]
_ ou impossible.
Votre application ne doit généralement pas utiliser _[NSNull null];
_. Vous ne l’utilisez que si vous souhaitez placer un objet "null" dans un tableau ou l’utiliser comme valeur de dictionnaire. Ensuite, vous devez savoir quels tableaux ou dictionnaires peuvent contenir des valeurs NULL et lesquels ne le peuvent pas.
Si vous pensez qu'un tableau ne contient jamais _[NSNull null]
_ valeurs, ne le vérifiez pas. S'il existe un _[NSNull null]
_, vous pouvez obtenir une exception, mais c'est correct: les exceptions Objective-C indiquent des erreurs de programmation. Et vous avez une erreur de programmation à corriger en modifiant du code.
Si un objet pourrait être _[NSNull null]
_, vous le vérifiez tout simplement en testant
_(object == [NSNull null])
_. Appeler isEqual
ou vérifier la classe de l'objet n'a aucun sens. Il n’existe qu’un seul objet _[NSNull null]
_, et l’opérateur le plus ancien du système le vérifie parfaitement de la manière la plus simple et la plus efficace.
Si vous cochez un objet NSString
qui ne peut pas être _[NSNull null]
_ (car vous savez qu'il ne peut pas être _[NSNull null]
_ ou parce que vous venez de vérifier qu'il est différent de _[NSNull null]
_, alors vous devez demandez-vous comment vous voulez traiter une chaîne vide, c'est-à-dire une chaîne de longueur 0. Si vous traitez qu'il s'agit d'une chaîne null
comme nil
, alors testez _(object.length == 0)
_. object.length retournera 0 si _object == nil
_, ce test couvre donc les objets nil et les chaînes de longueur 0. Si vous traitez une chaîne de longueur 0 différente de la chaîne nil, vérifiez simplement si _object == nil
_.
Enfin, si vous souhaitez ajouter une chaîne à un tableau ou à un dictionnaire et que la chaîne peut être nil, vous avez le choix entre ne pas l'ajouter, le remplacer par _@""
_ ou le remplacer par _[NSNull null]
_ . Le remplacer par _@""
_ signifie que vous perdez la possibilité 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 recherche les objets _[NSNull null]
_.
Voici la macro que j'utilise pour une chaîne sûre au lieu d'obtenir la chaîne "(null)" sur un UILabel, par exemple:
#define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)
disons que vous avez une propriété de classe et un nom de membre, et que le nom est nil:
NSLog(@"%@", member.name); // prints (null) on UILabel
avec macro:
NSLog(@"%@", SafeString(member.name)); // prints empty string on UILabel
Agréable et propre.
Vous venez de vérifier pour rien
if(data[@"Bonds"]==nil){
NSLog(@"it is nil");
}
ou
if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
NSLog(@"it is null");
}
@interface NSString (StringFunctions)
- (BOOL) hasCharacters;
@end
@implementation NSString (StringFunctions)
- (BOOL) hasCharacters {
if(self == (id)[NSNull null]) {
return NO;
}else {
if([self length] == 0) {
return NO;
}
}
return YES;
}
@end
NSString *strOne = nil;
if([strOne hasCharacters]) {
NSLog(@"%@",strOne);
}else {
NSLog(@"String is Empty");
}
Cela fonctionnerait avec les cas suivants: NSString *strOne = @""
OR NSString *strOne = @"StackOverflow"
OR NSString *strOne = [NSNull null]
OR NSString *strOne
.
if(textfield.text.length == 0){
//do your desired work
}
Essayez ceci pour check null
if (text == nil)
Si ce genre de chose n'existe pas déjà, vous pouvez créer une catégorie NSString:
@interface NSString (TrucBiduleChoseAdditions)
- (BOOL)isEmpty;
@end
@implementation NSString (TrucBiduleChoseAdditions)
- (BOOL)isEmpty {
return self == nil || [@"" isEqualToString:self];
}
@end
Je ne vérifie que la chaîne nulle avec
if ([myString isEqual: [NSNull null]])
La vérification complète d’une chaîne pour les conditions NULL peut être une suite de s: <\ br>
if (mystring) { if ([[mystring isEqualToString: @ ""])] { mystring = @ "une chaîne"; } } else { //statements }
Ce qui fonctionne pour moi, c'est if ( !myobject )