Comment testez-vous si un NSString est vide? ou tout espace blanc ou nul? avec un seul appel de méthode?NSString est vide
Répondre
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.
Comment puis-je faire tout cela avec un seul appel de méthode? – Yazzmi
@Yazzmi, j'ai édité ma réponse. –
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). –
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;
}
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;
}
Au lieu de faire la comparaison finale à @" "vous devriez juste voir si la [longueur de la chaîne] == 0 –
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)
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
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.
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. –
devrait être plus facile:
if (![[string stringByReplacingOccurencesOfString:@" " withString:@""] length]) { NSLog(@"This string is empty"); }
Peut-être que vous pouvez essayer quelque chose comme ceci:
+ (BOOL)stringIsEmpty:(NSString *)str
{
return (str == nil) || (([str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]).length == 0);
}
dup es posible: http: //stackoverflow.com/questions/899209/how-do-i- test-if-a-string-is-empty-dans-objectif-c –