2010-08-08 15 views
34

¿Cómo se prueba si un NSString está vacío? o todos los espacios en blanco o nulos? con un solo método de llamada?NSString está vacío

+0

Posible DUP: http: //stackoverflow.com/questions/899209/how-do-i- test-if-a-string-is-empty-in-objective-c –

Respuesta

93

Usted puede intentar algo así:

@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 

Mira la referencia NSString de ADC.

+0

¿cómo puedo hacer todo eso con una sola llamada a un método? – Yazzmi

+0

@Yazzmi, edité mi respuesta. –

+0

Como acaba de escribir una función para usted, llame a eso. Aunque lo cambiaría para que devuelva SÍ si estaba vacío, nulo o tenía espacios en blanco, y NO si la cadena tenía caracteres (la función como está escrita devolverá NO si hay caracteres en la cadena). –

7

utilizo,

+ (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

Esto es lo que yo uso, una extensión 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; 
} 
+5

En lugar de hacer la comparación final @" "debería ver si la [longitud de cadena] == 0 –

2

estoy usando esta definición, ya que funciona con cadenas nulas, así como cadenas vacías:

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

En realidad ahora es así:

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

Sobre la base de la respuesta de Jacob Relkin y Jonathan comentario:

@implementation TextUtils 

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

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

     return NO; 
    } 

    @end 
4

odio a lanzar otro registro en esta excepcionalmente viejo fuego, pero estoy preocupado por la edición de la respuesta de otra persona - especialmente cuando es el seleccionado responder.

Jacob hizo una pregunta de seguimiento: ¿Cómo puedo hacer esto con una sola llamada a un método?

La respuesta es crear una categoría, que básicamente amplía la funcionalidad de una clase Objective-C básica, y escribir un método de "taquigrafía" para el resto del código.

Sin embargo, técnicamente, una cadena con espacios en blanco no está vacía, simplemente no contiene glifos visibles (durante los últimos años he estado utilizando un método llamado ismptyString: y convertido hoy después de leer este conjunto de pregunta, respuesta y comentario).

Para crear una categoría, vaya a Opción + clic -> Nuevo archivo ... (o Archivo -> Nuevo -> Archivo ... o simplemente comando + n) -> elija categoría Objetivo-C. Elija un nombre para la categoría (esto ayudará a su espacio de nombres y reducirá posibles conflictos futuros) - elija NSString en el menú desplegable "Categoría activada" - guarde el archivo en algún lugar. (Nota: El archivo se denominará automáticamente NSString + YourCategoryName.h y .m.)

Personalmente valoro la naturaleza autoevaluada de Objective-C; por lo tanto, he creado el siguiente método de categoría en NSString modificando mi método isEmptyString original y optando por un método declarado más acertadamente (confío en que el compilador comprima el código más tarde, tal vez un poco demasiado).

cabecera (.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 

implementación (.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 

Para llamar al método asegúrese de import el archivo NSString + MyCategoryName.h en el .h o .m (Prefiero el.m para las categorías) de clase donde se ejecuta este tipo de validación y de hacer lo siguiente:

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

Esperemos que cubre todas las bases. Recuerdo que cuando comencé a desarrollar Objective-C, la categoría era una de esas "¿eh?" pruebas para mí, pero ahora las uso bastante para aumentar la reutilización.

Editar: Y supongo que, técnicamente, si estamos despojar caracteres, esto:

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

es realmente todo lo que se necesita (debe hacer todo lo que hace el método categoría, incluyendo la copia), pero Podría estar equivocado en ese punto.

+0

que ahora convertí a esa sola línea en lugar de la categoría método en todo mi código - funciona como se esperaba; por lo tanto, no es necesario crear código adicional para mantener. –

0

debería ser más fácil:

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

Tal vez usted puede intentar algo como esto:

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