Comprobación de la igualdad en Objective-C
-
21-09-2019 - |
Pregunta
¿Cómo puedo comprobar la llave en el diccionario es igual que la cadena de parámetro de método? es decir por debajo de código, dictobj es objeto de NSMutableDictionary, y para cada clave en dictobj i necesidad de comparar con una cuerda. ¿Cómo lograr esto? ¿Debo Typecase clave para NSString ??
-(void)CheckKeyWithString:(NSString *)string
{
//foreach key in NSMutableDictionary
for(id key in dictobj)
{
//Check if key is equal to string
if(key == string)// this is wrong since key is of type id and string is of NSString,Control doesn't come into this line
{
//do some operation
}
}
}
Solución
Cuando se utiliza el operador ==
, que está comparando valores de puntero. Esto sólo funciona cuando los objetos se están comparando son exactamente el mismo objeto, en la misma dirección de memoria. Por ejemplo, el código volverá These objects are different
porque a pesar de las cuerdas son los mismos, se almacenan en diferentes ubicaciones en la memoria:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if(foo == bar)
NSLog(@"These objects are the same");
else
NSLog(@"These objects are different");
Cuando se comparan cadenas, por lo general, que desee comparar el contenido textual de las cuerdas en lugar de sus punteros, por lo que debe el método de -isEqualToString:
NSString
. Este código volverá These strings are the same
porque compara el valor de los objetos de cadena en lugar de sus valores de puntero:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if([foo isEqualToString:bar])
NSLog(@"These strings are the same");
else
NSLog(@"These string are different");
Para comparar arbitraria de Objective-C objetos que puedes usar el método isEqual:
más general de NSObject
. -isEqualToString:
es una versión optimizada de -isEqual:
que se debe utilizar cuando se sabe que ambos objetos son objetos NSString
.
- (void)CheckKeyWithString:(NSString *)string
{
//foreach key in NSMutableDictionary
for(id key in dictobj)
{
//Check if key is equal to string
if([key isEqual:string])
{
//do some operation
}
}
}