2010-08-08 4 views
34

Comment testez-vous si un NSString est vide? ou tout espace blanc ou nul? avec un seul appel de méthode?NSString est vide

+0

dup es posible: http: //stackoverflow.com/questions/899209/how-do-i- test-if-a-string-is-empty-dans-objectif-c –

Répondre

93

Vous pouvez essayer quelque chose comme ceci:

@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 

Vérifiez la référence NSString sur ADC.

+0

Comment puis-je faire tout cela avec un seul appel de méthode? – Yazzmi

+0

@Yazzmi, j'ai édité ma réponse. –

+0

Depuis qu'il vient d'écrire une fonction pour vous, appelez ça. Bien que je le change pour retourner YES s'il était vide, nul, ou a eu des espaces - et NON si la chaîne avait des caractères dedans (la fonction comme écrite retournera NON s'il y a des caractères dans la chaîne). –

7

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

C'est ce que je l'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; 
} 
+5

Au lieu de faire la comparaison finale à @" "vous devriez juste voir si la [longueur de la chaîne] == 0 –

2

J'utilise cette définition comme cela fonctionne avec des chaînes nulles, ainsi que des chaînes vides:

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

fait maintenant son comme ceci:

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

Sur la base de la réponse Jacob Relkin et commentaires Jonathan:

@implementation TextUtils 

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

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

     return NO; 
    } 

    @end 
4

Je déteste jeter un autre journal sur ce feu exceptionnellement vieux, mais je suis méfiante sur la modification de la réponse de quelqu'un d'autre - surtout quand il est sélectionné répondre. Jacob a posé une question de suivi: Comment est-ce que je peux faire ceci avec un appel de méthode simple? La réponse est, en créant une catégorie - qui étend essentiellement les fonctionnalités d'une classe Objective-C de base - et en écrivant une méthode «sténographique» pour tous les autres codes. Cependant, techniquement, une chaîne avec des espaces blancs n'est pas vide - elle ne contient pas de glyphes visibles (depuis quelques années, j'utilise une méthode appelée isEmptyString: et convertie aujourd'hui après avoir lu ceci question, réponse et ensemble de commentaires).

Pour créer une catégorie, allez dans Option + Cliquez -> Nouveau fichier ... (ou Fichier -> Nouveau -> Fichier ... ou commandez simplement + n) -> choisissez Catégorie Objectif-C. Choisissez un nom pour la catégorie (cela aidera l'espace de nom et réduira les conflits futurs possibles) - choisissez NSString dans la liste déroulante «Catégorie sur» - enregistrez le fichier quelque part. (Note: Le fichier sera automatiquement nommé NSString + YourCategoryName.h et .m.)

Personnellement, j'apprécie la nature auto-documentée d'Objective-C; par conséquent, j'ai créé la méthode de catégorie suivante sur NSString en modifiant ma méthode isEmptyString: d'origine et en optant pour une méthode plus correctement déclarée (j'espère que le compilateur compressera le code plus tard - peut-être un peu trop).

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 de #import le fichier NSString + MyCategoryName.h dans le .h ou .m (je préfère le.m pour les catégories) classe 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 une de ces "hein?" des épreuves pour moi - mais maintenant je les utilise un peu pour augmenter la réutilisabilité.

Edit: Et je suppose que, techniquement, si nous caractères stripping, ceci:

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

Est-ce vraiment tout ce qui est nécessaire (il faut faire tout ce que la méthode de la catégorie ne, y compris la copie), mais Je pourrais me tromper sur ce point.

+0

Je suis maintenant converti juste à cette ligne au lieu de la catégorie méthode dans tout mon code - fonctionne comme prévu; donc, pas besoin de créer du code supplémentaire à maintenir. –

0

devrait être plus facile:

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

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

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