¿Cómo pruebo si una cadena está vacía en Objective-C?

Respuestas:

1156

Puedes comprobar si [string length] == 0. Esto verificará si es una cadena válida pero vacía (@ ""), así como si es nula, ya que llamar lengtha nil también devolverá 0.

Marc Charbonneau
fuente
12
Hay algunas NSStrings muy raras en las que esto dará como resultado un falso negativo (decir que la cadena no está vacía, cuando, para fines prácticos, lo es). Considere @"\u200B"(que consiste solo en el carácter Unicode ESPACIO DE ANCHO CERO . Imprimirlo imprimirá 0 caracteres (verificar usando una fuente monoespaciada), pero string.length dará 1. Hay otros caracteres Unicode (como el CARACTER DE REEMPLAZO DE OBJETOS ) que se comportan de la misma manera. obtener el último cuando se analiza el texto PDF.
fzwo
43
@fzwo no es un imbécil, pero en teoría no da un falso negativo. Se comporta exactamente como cabría esperar. Su interpretación de lo que ZERO WIDTH SPACEes realmente no importa, porque de todos modos @"\u200B" es un carácter, así que si prueba que la cadena esté vacía, dirá que no lo es porque hay un carácter en ella. Simplemente no se puede imprimir siguiendo el estándar Unicode.
bmeulmeester
2
Por supuesto, es técnicamente correcto, no estoy discutiendo eso. Solo quiero advertir que esto puede no exhibir el comportamiento previsto o esperado, por eso escribí "con fines prácticos". Depende del significado previsto de "vacío".
fzwo
44
No es un falso negativo. Un "espacio de valor cero" es un carácter unicode como cualquier otro. Simplemente "vale la pena recordarlo" si es relevante para su aplicación. (Gran pensamiento, fzwo!)
Fattie
2
Déjame saber si estoy equivocado, pero creo que también se podría omitir == 0 parte y añadir una negación delante: ![string length]. Parece más limpio.
damirstuhec
126

La respuesta de Marc es correcta. Pero aprovecharé esta oportunidad para incluir un puntero al generalizado de Wil Shipley isEmpty, que compartió en su blog :

static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
Matt G
fuente
26
Si desea que esto sea muy generalizado, uno podría implementar esta lógica como una categoría en NSObject en lugar de usar un método estático como se muestra aquí.
Brad The App Guy
16
Curiosamente, esto en realidad no verifica [NSNull null].
Peter N Lewis
14
Si se encuentra en una situación en la que no sabe qué tipo de objeto está comprobando, supongo que esto funciona. Sin embargo, sugiero que si no sabe si un objeto es NSData o NSArray, tiene mayores problemas. ¿Cuál será tu próxima macro después de esta llamada, condenseToSingleNSData (id)? expandToNSArray (cosa de identificación)? Tarde o temprano, te preguntarás con qué clase de clase estás lidiando, mejor hacerlo en la primera referencia.
Brane
1
@BradSmith, se podría crear una categoría para él, pero los valores nulos no se contarían ya que no se llamaría al método. Por ejemplo, si thing = nil, [thing IsEmpty] no se llamaría y siempre devolvería false / NO. Para verificar nil, debe haber un parámetro. Los objetos nulos no pueden compararse a sí mismos como nulos a través de una categoría.
Chris
3
@ Chris entonces se puede cambiar el método de categoría a -isNotEmpty:)
nielsbot
93

El primer enfoque es válido, pero no funciona si su cadena tiene espacios en blanco ( @" "). Por lo tanto, debe borrar estos espacios en blanco antes de probarlo.

Este código borra todos los espacios en blanco a ambos lados de la cadena:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

Una buena idea es crear una macro, para que no tenga que escribir esta línea de monstruo:

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]

Ahora puedes usar:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
Equipo de desarrollo de SEQOY
fuente
3
¿Por qué usar macros cuando no son necesarios? En este caso, se sacrifica cualquier tipo de seguridad sin beneficio real.
EM
Es por simple conveniencia, si desea escribir "[object stringObject stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]" cada vez que desee verificar si una cadena está vacía, depende de usted.
Equipo de desarrollo de SEQOY
18
mejor sería atendido por una NSStringcategoría que agrega un método llamado trimmedStringque hace exactamente lo que escribió.
Dave DeLong
2
¡Tenga en cuenta que Apple whitespaceCharacterSetno incluye nuevas líneas! Aquí hay una categoría que escribí incluyendo trimy algunos otros métodos útiles: github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/…
AlexChaffee
@EM No soy fanático de las macros, pero no entiendo su preocupación por la seguridad de tipos. Durante la compilación, la macro se reemplaza por su contenido, por lo que si invoca la macro con algo diferente de un NSString, aún recibe un mensaje del compilador. Las categorías serían mucho mejores de todos modos.
Zmaster
32

Una de las mejores soluciones que he visto (mejor que la de Matt G) es esta función en línea mejorada que elegí en algún repositorio de Git Hub (la de Wil Shipley, pero no puedo encontrar el enlace):

// Check if the "thing" passed is empty
static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}
Robar
fuente
2
Este es el trabajo de Wil Shipley. Para su información, puede cambiar [thing isKindOfClass: [NSNull class]] a solo (thing == [NSNull null])
Steve N
Uf ... exactamente lo que estaba buscando. Me estaba volviendo loco, tratando de averiguar por qué mi función "cellForRowAtIndexPath" se bloqueaba debido a cadenas nulas (y no pude detectar el problema). Esta función lo resolvió perfectamente.
Mike Gledhill
Copia del comentario de @Brane: Si se encuentra en una situación en la que no sabe qué tipo de objeto está comprobando, supongo que esto funciona. Sin embargo, sugiero que si no sabe si un objeto es NSData o NSArray, tiene mayores problemas. ¿Cuál será tu próxima macro después de esta llamada condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Tarde o temprano, te preguntarás con qué clase de clase estás lidiando, mejor hacerlo en la primera referencia.
Cœur
16

Deberías usar mejor esta categoría:

@implementation NSString (Empty)

    - (BOOL) isWhitespace{
        return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
    }

@end
Coeur
fuente
66
Esa definición conluiría que la cadena "/ r / n / r / n" está vacía, cuando claramente no lo está: contiene espacios en blanco. Su función es realmente: - (BOOL) isWhitespace (NSString *);
JBRWilkinson
66
Un corolario de esto. Implementé esta categoría, y hay un giro. Si llama a esto en una cadena nula, esta función nunca se llama y obtiene un NO (o lo que se evalúa como NO) como valor de retorno. Entonces crees que no está vacío ... Esto podría funcionar si el nombre se rellena o algo así.
Ying
Supongo que la categoría correcta sería: @implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end como una combinación de la respuesta de Marc y Kyle.
palma
12

Pongo esto:

@implementation NSObject (AdditionalMethod)
-(BOOL) isNotEmpty
{
    return !(self == nil
    || [self isKindOfClass:[NSNull class]]
    || ([self respondsToSelector:@selector(length)]
        && [(NSData *)self length] == 0)
    || ([self respondsToSelector:@selector(count)]
        && [(NSArray *)self count] == 0));

};
@end

El problema es que si self es nulo, esta función nunca se llama. Volverá falso, lo que se desea.

user4951
fuente
la mejor solución ya que a) es el método de instancia yb) la categoría c) el caso nulo en sí mismo se maneja con 'isNotEmpty' Thx!
Denis
Gran idea, una lástima -(BOOL)isEmpty{ return ![self isNotEmpty]}que no funcionará en la categoría.
Alston
Copia del comentario de @Brane: Si se encuentra en una situación en la que no sabe qué tipo de objeto está comprobando, supongo que esto funciona. Sin embargo, sugiero que si no sabe si un objeto es NSData o NSArray, tiene mayores problemas. ¿Cuál será tu próxima macro después de esta llamada condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Tarde o temprano, te preguntarás con qué clase de clase estás lidiando, mejor hacerlo en la primera referencia.
Cœur
11

Otra opción es comprobar si es igual a @""la isEqualToString:de este modo:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}
chown
fuente
11

Simplemente pase su cadena al siguiente método:

+(BOOL)isEmpty:(NSString *)str
{
    if(str.length==0 || [str isKindOfClass:[NSNull class]] || [str isEqualToString:@""]||[str  isEqualToString:NULL]||[str isEqualToString:@"(null)"]||str==nil || [str isEqualToString:@"<null>"]){
        return YES;
    }
    return NO;
}
Mani
fuente
Vea los comentarios en stackoverflow.com/questions/21605075/… para saber por qué esto está mal. Además, ¿cómo es esto mejor que las otras respuestas aquí?
Popeye
6

Solo usa uno de los if else condiciones como se muestra a continuación:

Método 1:

if ([yourString isEqualToString:@""]) {
        // yourString is empty.
    } else {
        // yourString has some text on it.
    }

Método 2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}
Samir Jwarchan
fuente
6

Versión rápida

Aunque esta es una pregunta del Objetivo C, necesitaba usarla NSStringen Swift, así que también incluiré una respuesta aquí.

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}

O si NSStringes un opcional:

var myOptionalNSString: NSString? = nil

if myOptionalNSString == nil || myOptionalNSString!.length == 0 {
    print("String is empty.")
}

// or alternatively...
if let myString = myOptionalNSString {
    if myString.length != 0 {
        print("String is not empty.")
    }
}

La Stringversión normal de Swift es

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
}

Ver también: ¿ Comprobar cadena vacía en Swift?

Suragch
fuente
5

Puede ser que esta respuesta sea el duplicado de las respuestas ya dadas, pero hice pocas modificaciones y cambios en el orden de verificación de las condiciones. Por favor, consulte el siguiente código:

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }
iDevAmit
fuente
Esta es una categoría, puede ver cómo crearla aquí: goo.gl/bRcfn7 . Me gusta la idea de una categoría para esto
Daniel Gómez Rico
No, no podemos decir que esta es una categoría. Si esta función se implementa bajo la categoría de la clase NSString, entonces es categoría. De lo contrario, podemos llamar a este método con el nombre de la clase donde sea que lo hayamos implementado. Al igual que Bool isEmptyStr = [MyClassName isStringEmpty: str] Pero aún así, será más bueno si lo declaramos en la categoría. Porque de alguna manera también necesitamos aprovechar las categorías.
iDevAmit
4

Puede verificar si su cadena está vacía o no usando este método:

+(BOOL) isEmptyString : (NSString *)string
{
    if([string length] == 0 || [string isKindOfClass:[NSNull class]] || 
       [string isEqualToString:@""]||[string  isEqualToString:NULL]  ||
       string == nil)
     {
        return YES;         //IF String Is An Empty String
     }
    return NO;
}

La mejor práctica es hacer que una clase compartida diga UtilityClass y agregue este método para que pueda usar este método simplemente llamándolo a través de su aplicación.

Fatima Arshad
fuente
4

Tiene 2 métodos para verificar si la cadena está vacía o no:

Supongamos que su nombre de cadena es NSString *strIsEmpty.

Método 1:

if(strIsEmpty.length==0)
{
    //String is empty
}

else
{
    //String is not empty
}

Método 2:

if([strIsEmpty isEqualToString:@""])
{
    //String is empty
}

else
{
    //String is not empty
}

Elija cualquiera de los métodos anteriores y conozca si la cadena está vacía o no.

Aditya
fuente
3

Simplemente verifique la longitud de su cuerda

 if (!yourString.length)
 {
   //your code  
 }

un mensaje a NIL devolverá nil o 0, por lo que no es necesario probar nil :).

Feliz codificación ...

Aks
fuente
He usado esto muchas veces. Absolutamente no hay necesidad de extensiones, categorías y qué no.
pnizzle
2

Funciona como un encanto para mi

Si el NSStringess

if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {

    NSLog(@"s is empty");

} else {

    NSLog(@"s containing %@", s);

}
MaxEcho
fuente
2

Entonces, aparte del concepto básico de verificar una longitud de cadena menor que 1, es importante considerar el contexto profundamente. Los idiomas humanos o informáticos o de otro modo pueden tener diferentes definiciones de cadenas vacías y dentro de esos mismos idiomas, el contexto adicional puede cambiar aún más el significado.

Digamos que una cadena vacía significa "una cadena que no contiene ningún carácter significativo en el contexto actual".

Esto podría significar visualmente, ya que el color y el color de fondo son los mismos en una cadena atribuida. Efectivamente vacío.

Esto podría significar vacío de caracteres significativos. Todos los puntos o todos los guiones o todos los guiones bajos pueden considerarse vacíos. Además, vacío de caracteres significativos significativos podría significar una cadena que no tiene caracteres que el lector entienda. Pueden ser caracteres en un idioma o conjunto de caracteres definido como sin sentido para el lector. Podríamos definirlo un poco diferente decir que la cadena no forma palabras conocidas en un idioma dado.

Podríamos decir que vacío es una función del porcentaje de espacio negativo en los glifos representados.

Incluso una secuencia de caracteres no imprimibles sin representación visual general no está realmente vacía. Los personajes de control vienen a la mente. Especialmente el bajo rango ASCII (me sorprende que nadie los haya mencionado ya que manejan muchos sistemas y no son espacios en blanco, ya que normalmente no tienen glifos ni métricas visuales). Sin embargo, la longitud de la cadena no es cero.

Conclusión. La longitud por sí sola no es la única medida aquí. La membresía contextual también es bastante importante.

La membresía del juego de caracteres es una medida adicional común muy importante. Las secuencias significativas también son bastante comunes. (piense en SETI o crypto o captchas) También existen conjuntos de contexto más abstractos adicionales.

Por lo tanto, piense detenidamente antes de asumir que una cadena solo está vacía según la longitud o el espacio en blanco.

Uchuugaka
fuente
2

Publicación muy útil, para agregar soporte NSDictionary y un pequeño cambio

static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && ![thing respondsToSelector:@selector(count)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [thing count] == 0);
}
Zeev Vax
fuente
Copia del comentario de @Brane: Si se encuentra en una situación en la que no sabe qué tipo de objeto está comprobando, supongo que esto funciona. Sin embargo, sugiero que si no sabe si un objeto es NSData o NSDictionary, tiene mayores problemas. ¿Cuál será tu próxima macro después de esta llamada condenseToSingleNSData(id thing)? expandToNSArray(id thing)? Tarde o temprano, te preguntarás con qué clase de clase estás lidiando, mejor hacerlo en la primera referencia.
Cœur
2
- (BOOL)isEmpty:(NSString *)string{
    if ((NSNull *) string == [NSNull null]) {
        return YES;
    }
    if (string == nil) {
        return YES;
    }
    if ([string length] == 0) {
        return YES;
    }
    if ([[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
        return YES;
    }
    if([[string stringByStrippingWhitespace] isEqualToString:@""]){
        return YES;
    }
    return NO;
}
Ptbaileys
fuente
1
Las primeras tres condiciones son redundantes, y no ha incluido la fuente parastringByStrippingWhitespace
mattsven
2

La mejor manera es usar la categoría.
Puede verificar la siguiente función. Que tiene todas las condiciones para verificar.

-(BOOL)isNullString:(NSString *)aStr{
        if([(NSNull *)aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if ((NSNull *)aStr  == [NSNull null]) {
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if(![[aStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]){
            return YES;
        }
        return NO;
    }
Tarun
fuente
1

La mejor manera en cualquier caso es verificar la longitud de la cadena dada. Para esto, si su cadena es myString, entonces el código es:

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }
AJS
fuente
1
if (string.length == 0) stringIsEmpty;
InvertidoHeli
fuente
1

Mira esto :

if ([yourString isEqualToString:@""])
{
    NsLog(@"Blank String");
}

O

if ([yourString length] == 0)
{
    NsLog(@"Blank String");
}

Espero que esto ayude.

Mayur
fuente
1

Puede verificar fácilmente si la cadena está vacía con esto:

if ([yourstring isEqualToString:@""]) {
    // execute your action here if string is empty
}
usuario3213914
fuente
1

He comprobado una cadena vacía usando el siguiente código:

//Check if we have any search terms in the search dictionary.
if( (strMyString.text==(id) [NSNull null] || [strMyString.text length]==0 
       || strMyString.text isEqual:@"")) {

   [AlertView showAlert:@"Please enter a valid string"];  
}
Jayprakash Dubey
fuente
1

Es tan simple como if([myString isEqual:@""])oif([myString isEqualToString:@""])

Ahsan Ebrahim
fuente
1
//Different validations:
 NSString * inputStr = @"Hey ";

//Check length
[inputStr length]

//Coming from server, check if its NSNull
[inputStr isEqual:[NSNull null]] ? nil : inputStr

//For validation in allowed character set
-(BOOL)validateString:(NSString*)inputStr
{
    BOOL isValid = NO;
    if(!([inputStr length]>0))
    {
        return isValid;

    }

    NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@".-"];
    [allowedSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
    if ([inputStr rangeOfCharacterFromSet:[allowedSet invertedSet]].location == NSNotFound)
    {
        // contains only decimal set and '-' and '.'

    }
    else
    {
        // invalid
        isValid = NO;

    }
    return isValid;
}
Rohit Kashyap
fuente
0

Puede tener una cadena vacía de dos maneras:

1) @ "" // No contiene espacio

2) @ "" // Contiene espacio

Técnicamente ambas cadenas están vacías. Podemos escribir ambas cosas simplemente usando UNA condición

if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
    NSLog(@"Empty String");
}
else
{
    NSLog(@"String contains some value");
}
Chetan Rajauria
fuente
0

Intenta lo siguiente

NSString *stringToCheck = @"";

if ([stringToCheck isEqualToString:@""])
{
   NSLog(@"String Empty");
}
else
{
   NSLog(@"String Not Empty");
}
Rich Allen
fuente
-1
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    
C_compnay
fuente
1
El cheque nulo debe ser el primero. str.lengthlanzará una excepción si stres nulo.
Jeffery Thomas
-2
if( [txtMobile.text length] == 0 )
{
    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
Mohsin Sabasara
fuente