iphone NSString est vide




ios objective-c (7)

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

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

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


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 lorsqu'il s'agit de 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 les fonctionnalités d'une classe Objective-C de base - et en écrivant une méthode "abrégée" pour tout le reste du 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 sera automatiquement nommé 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 nous supprimons 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.


Devrait être plus facile:

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

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

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)

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

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 la référence NSString sur ADC.





nsstring