web-dev-qa-db-fra.com

Quel est le bon moyen de rechercher une chaîne nulle dans Objective-C?

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?

177
Teo Choong Ping

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.

387
Peter N Lewis

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.

24
Bluephlame

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

6
TimM

Quoi avec tous ces "fonctionne pour moi des réponses"? Nous codons tous dans la même langue et les règles sont

  1. Assurez-vous que la référence n'est pas nil
  2. Vérifiez et assurez-vous que la longueur de la chaîne n'est pas 0

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.

5
nenchev

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.

5
Guardius

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);
}
4
diederikh

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]_.

3
gnasher729

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.

2
mgyky

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");
}
2
Gami Nilesh
@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.

1
Hemang
if(textfield.text.length == 0){
   //do your desired work
}
1

Essayez ceci pour check null

 if (text == nil)
1
Vineesh TP

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
0
Rémy

Je ne vérifie que la chaîne nulle avec

if ([myString isEqual: [NSNull null]])

0
JerryZhou

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
}
0
Alen Alexander

Ce qui fonctionne pour moi, c'est if ( !myobject )