Comment tester si une NSString est vide ? ou entièrement composée d'espaces ou nulle ? avec un seul appel de méthode ?
Réponses
Trop de publicités?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.
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;
}
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;
}
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.