2011-08-06 21 views
18

En mi aplicación hay un mecanismo que requiere que en un cierto punto dos NSString s sean lo mismo para hacer algo; por alguna razón, cuando comparo los dos, incluso cuando son iguales, todavía no lo reconocen. El código es algo como esto:Comparar dos NSStrings

NSString * aString = [self someMethodThatGetsAString]; 

NSString * bString; 

BOOL areStringsTheSame = NO; 

while (areStringsTheSame != YES) { 

     bString = [self someMethodThatTakesNSStringsFromAnArrey]; 
     if (bString == aString) { 
      areStringsTheSame = YES; 
     { } 

incluso he insertado una NSLog() y se aseguró de que en un momento determinado que eran los mismos (y por lo que sé que esto es lo que significa == ...), pero aún no entró en el if para cambiar el valor BOOL.

¿Hay alguna otra forma de hacer esta comparación? ¿Me estoy perdiendo de algo?

Respuesta

72

Usted puede utilizar el método isEqualToString::

if ([bString isEqualToString:aString]) 

== compara las referencias (direcciones de) las cuerdas, y no el valor de las cuerdas.

+2

Cierto. Y profundice en los principios de OOP (dos objetos con las mismas propiedades no son necesariamente los mismos objetos). De lo contrario, vas a encontrar este problema todos los días de tu vida de desarrollador :-) – vstrien

+0

Aparentemente '==' funciona igual de bien para comparar cadenas con mayúsculas y minúsculas, debido a la forma en que Objective-C usa variables de cadena. Por ejemplo, declare una cadena A y una cadena B, y haga '==' y encontrará que ambas están almacenadas en la misma dirección. –

2

Recientemente me sorprendió el hecho de que dos NSStrings que se parecen entre sí en NSLog pueden ser diferentes. Es porque a veces NSString puede contener un carácter de espacio de ancho cero. Sé consciente de ello y tener en cuenta:

#define ZERO_WIDTH_SPACE_STRING @"\u200B" 

para conquistar esto, usted debe limpiar su cadena a partir de cero caracteres de espacio en blanco de ancho antes de comparar:

NSMutableString *eMailToAdd = [NSMutableString string]; 

NSMutableCharacterSet *charSet = [[NSCharacterSet whitespaceCharacterSet] mutableCopy]; 
    //[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; 

    NSString *rawStr = [[tokenField textField] text]; 
    for (int i = 0; i < [rawStr length]; i++) 
    { 
     if (![charSet characterIsMember:[rawStr characterAtIndex:i]]) 
     { 
      [eMailToAdd appendFormat:@"%@",[NSString stringWithFormat:@"%c", [rawStr characterAtIndex:i]]]; 
     } 
    } 
3

Este enfoque funcionó para mí:

if ([firstString compare:secondString] == NSOrderedSame) { 
    //Do something when they are the same 
} else { 
    //Do something when they are different 
}