web-dev-qa-db-fra.com

NSString est vide

Comment testez-vous si un NSString est vide? ou tous les espaces blancs ou nuls? avec un seul appel de méthode?

34
Yazzmi

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

Découvrez la NSString référence sur ADC.

95
Jacob Relkin

C'est ce que j'utilise, une extension à 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;  
}
14
scooter133

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;  
}
7
karim

Je n'aime pas jeter un autre journal sur cet incendie exceptionnellement ancien, mais je me méfie de la modification de la réponse de quelqu'un d'autre, surtout lorsque c'est la réponse sélectionnée.

Jacob posa une question suivante: Comment puis-je faire cela avec un seul appel de méthode?

La réponse est, en créant une catégorie - qui étend fondamentalement la fonctionnalité d'une classe Objective-C de base - et en écrivant une méthode "abrégée" pour tout le code. 

Toutefois, techniquement, une chaîne contenant des espaces n'est pas vide - elle ne contient simplement pas de glyphes visibles (depuis quelques années, j'utilise une méthode appelée isEmptyString: et convertie aujourd'hui après avoir lu cette question, répondez, et l'ensemble des commentaires).

Pour créer une catégorie, allez à Option + Cliquez sur -> Nouveau fichier ... (ou Fichier -> Nouveau -> Fichier ... ou tout simplement sur commande + n) -> choisissez Catégorie Objective-C. Choisissez un nom pour la catégorie (cela aidera l’espace de nom et réduira les conflits futurs possibles) - choisissez NSString dans le menu déroulant "Catégorie sur" - sauvegardez le fichier quelque part. (Remarque: le fichier s'appellera automatiquement NSString + YourCategoryName.h et .m.)

J'apprécie personnellement la nature auto-documentée d'Objective-C; Par conséquent, j'ai créé la méthode suivante sur NSString en modifiant ma méthode isEmptyString: et en optant pour une méthode plus correctement déclarée (j'espère que le compilateur compressera le code ultérieurement - 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, veillez à 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 ce type de validation et procédez comme suit:

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

Espérons que cela couvre toutes les bases. Je me souviens quand j'ai commencé à développer pour Objective-C, la catégorie était l'un de ces "hein?" épreuves pour moi - mais maintenant je les utilise un peu pour augmenter la réutilisabilité.

Edit: Et je suppose, techniquement, si on enlève des personnages, ceci:

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

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

4
Josh Bruce

J'utilise cette définition car elle fonctionne avec des chaînes nil ainsi que des 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)
2
Cherpak Evgeny

Basé sur la réponse de Jacob Relkin et le commentaire de Jonathan:

@implementation TextUtils

    + (BOOL)isEmpty:(NSString*) string {

        if([string length] == 0 || ![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
            return YES;
        }

        return NO;
    }

    @end
0
pvllnspk

Peut-être que vous pouvez essayer quelque chose comme ça:

+ (BOOL)stringIsEmpty:(NSString *)str
{
    return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
}
0
liushuaikobe

Devrait être plus facile:

if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }
0
MCKapur