2010-02-19 19 views
13

¿Cómo verifico que la clave en el diccionario es igual a la cadena en el parámetro del método? es decir, en el código de abajo, dictobj es el objeto de NSMutableDictionary, y para cada clave en dictobj necesito compararlo con la cadena. ¿Cómo lograr esto? ¿Debo escribir la clave de NSString?Comprobando la igualdad en Objective-C

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

Respuesta

38

Cuando utiliza el operador ==, está comparando valores de puntero. Esto solo funcionará cuando los objetos que comparas sean 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, normalmente se desea comparar el contenido textual de las cuerdas en lugar de sus punteros, por lo que debe el método -isEqualToString: de 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 objetos Objective-C se debe utilizar el método más general isEqual: de NSObject. -isEqualToString: es una versión optimizada de -isEqual: que debe usar cuando sepa 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 
      } 
    } 
} 
+0

superb .. gracias mucho Rob ... funcionó :) – suse