36 votes

NSString est vide

Comment tester si une NSString est vide ? ou entièrement composée d'espaces ou nulle ? avec un seul appel de méthode ?

96voto

Jacob Relkin Points 90729

Vous pouvez essayer quelque chose comme ça :

@implementation NSString (JRAdditions)

+ (BOOL)isStringEmpty:(NSString *)string {
   if([string length] == 0) { //string is empty or nil
       return YES;
   } 

   if(![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
       //string is all whitespace
       return YES;
   }

   return NO;
}

@end

Consultez le NSString référence sur l'ADC.

14voto

scooter133 Points 732

C'est ce que j'utilise, une extension de NSString :

+ (BOOL)isEmptyString:(NSString *)string;
// Returns YES if the string is nil or equal to @""
{
    // Note that [string length] == 0 can be false when [string isEqualToString:@""] is true, because these are Unicode strings.

    if (((NSNull *) string == [NSNull null]) || (string == nil) ) {
        return YES;
    }
    string = [string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if ([string isEqualToString:@""]) {
        return YES;
    }

    return NO;  
}

7voto

karim Points 4704

J'utilise,

+ (BOOL ) stringIsEmpty:(NSString *) aString {

    if ((NSNull *) aString == [NSNull null]) {
        return YES;
    }

    if (aString == nil) {
        return YES;
    } else if ([aString length] == 0) {
        return YES;
    } else {
        aString = [aString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([aString length] == 0) {
            return YES;
        }
    }

    return NO;  
}

+ (BOOL ) stringIsEmpty:(NSString *) aString shouldCleanWhiteSpace:(BOOL)cleanWhileSpace {

    if ((NSNull *) aString == [NSNull null]) {
        return YES;
    }

    if (aString == nil) {
        return YES;
    } else if ([aString length] == 0) {
        return YES;
    } 

    if (cleanWhileSpace) {
        aString = [aString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([aString length] == 0) {
            return YES;
        }
    }

    return NO;  
}

4voto

Josh Bruce Points 136

Je déteste jeter une autre bûche sur ce vieux feu exceptionnel, mais je suis réticent à l'idée de modifier la réponse de quelqu'un d'autre, surtout quand il s'agit de la réponse sélectionnée.

Jacob a posé une question complémentaire : Comment puis-je faire cela avec un seul appel de méthode ?

La réponse est : en créant une catégorie - qui étend essentiellement la fonctionnalité d'une classe Objective-C de base - et en écrivant une méthode "raccourcie" pour tout le reste du code.

Toutefois, d'un point de vue technique, une chaîne comportant des caractères d'espace blanc n'est pas vide - elle ne contient simplement aucun glyphe visible (depuis quelques années, j'utilise une méthode appelée isEmptyString : et je l'ai convertie aujourd'hui après avoir lu cet ensemble de questions, réponses et commentaires).

Pour créer une catégorie, allez dans Option+Click -> New File... (ou File -> New -> File... ou simplement command+n) -> choisissez Objective-C Category. Choisissez un nom pour la catégorie (cela vous aidera à la nommer et à réduire les éventuels conflits futurs) - choisissez NSString dans la liste déroulante "Category on" - enregistrez le fichier quelque part. (Note : Le fichier sera automatiquement nommé NSString+VotreNomDeCatégorie.h et .m.)

J'apprécie personnellement la nature auto-documentée de l'Objective-C ; c'est pourquoi j'ai créé la méthode de catégorie suivante sur NSString, en modifiant ma méthode isEmptyString : originale et en optant pour une méthode déclarée de manière plus appropriée (je fais confiance au compilateur pour compresser le code plus tard - peut-être un peu trop).

En-tête (.h) :

#import <Foundation/Foundation.h>

@interface NSString (YourCategoryName)

/*! Strips the string of white space characters (inlcuding new line characters).
 @param string NSString object to be tested - if passed nil or @"" return will
     be negative
 @return BOOL if modified string length is greater than 0, returns YES; 
 otherwise, returns NO */
+ (BOOL)visibleGlyphsExistInString:(NSString *)string;

@end

Mise en œuvre (.m) :

@implementation NSString (YourCategoryName)

+ (BOOL)visibleGlyphsExistInString:(NSString *)string
{
    // copying string should ensure retain count does not increase
    // it was a recommendation I saw somewhere (I think on stack),
    // made sense, but not sure if still necessary/recommended with ARC
    NSString *copy = [string copy];

    // assume the string has visible glyphs
    BOOL visibleGlyphsExist = YES;
    if (
        copy == nil
        || copy.length == 0
        || [[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
        ) {
        // if the string is nil, no visible characters would exist
        // if the string length is 0, no visible characters would exist
        // and, of course, if the length after stripping the white space
        // is 0, the string contains no visible glyphs
        visibleGlyphsExist = NO;

    }
    return visibleGlyphsExist;

}

@end

Pour appeler la méthode, assurez-vous d'importer le fichier NSString+MyCategoryName.h dans la classe .h ou .m (je préfère le .m pour les catégories) où vous exécutez cette sorte de validation et faites ce qui suit :

NSString* myString = @""; // or nil, or tabs, or spaces, or something else
BOOL hasGlyphs = [NSString visibleGlyphsExistInString:myString];

J'espère que cela couvre toutes les bases. Je me souviens que lorsque j'ai commencé à développer en Objective-C, la question des catégories était une de ces épreuves "huh ?" pour moi - mais maintenant je les utilise assez souvent pour augmenter la réutilisabilité.

Edit : Et je suppose que, techniquement, si on enlève les caractères, ceci :

[[copy stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0

C'est vraiment tout ce qui est nécessaire (il devrait faire tout ce que la méthode de la catégorie fait, y compris la copie), mais je peux me tromper sur ce point.

2voto

Cherpak Evgeny Points 131

J'utilise cette définition car elle fonctionne aussi bien avec les chaînes nil qu'avec les chaînes vides :

#define STR_EMPTY(str)  \
    str.length == 0

En fait, maintenant c'est comme ça :

#define STR_EMPTY(str)  \
    (![str isKindOfClass:[NSString class]] || str.length == 0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X