2012-02-12 9 views
8

Estoy intentando acceder a mi objeto de diccionario. Aquí está mi código:Usando un int como clave NSDictionary?

int tag = object.tag; 
CGPoint point = [[self.dict objectForKey:tag] CGPointValue]; 

El problema es que objectForKey debe tomar un objeto Objective-C, no un int. Intenté envolver la etiqueta en un NSNumber con [NSNumber numberWithInt:tag] y pasar eso a objectForKey: pero devuelve un objeto nulo.

¿Alguna idea? Gracias

+3

¿Cómo se ponen los objetos en 'self.dict' en ¿El primer lugar? – mattjgalloway

+0

initWithObjectsAndKeys: [NSValue valueWithCGPoint: CGPointMake (1,2)], @ "100", etc. Tenga en cuenta que mi diccionario está bien, estoy accediendo a él en otras partes de mi código con un for-in (para la clave id en auto.dict) loop. Sin embargo, en este caso, no quiero usar un bucle. Gracias – user339946

Respuesta

13

Si está usando números como cadenas para las teclas del diccionario, debe convertir el int en NSString o NSNumber para usarlo como clave de diccionario. Así es como que lo haga por una cadena:

NSString *key = [NSString stringWithFormat:@"%d", myInteger]; 

Como @Hughes BR menciona en un comentario, el requisito de que el objeto fundamental es que debe cumplir con el protocolo NSCopying.

+0

Hola, configuré manualmente mi object.tag para que sea 100, 101, etc. Las claves del diccionario se escriben como @ "101". Tenga en cuenta que he accedido al diccionario con éxito en otras partes de mi código, específicamente cuando utilicé un bucle for-in. Mis objetos y teclas de diccionario están todos allí. – user339946

+15

No necesita usar una cadena. Un 'NSNumber' sería suficiente y podría ser un ajuste más natural. '[NSNumber numberWithInteger: [object tag]]' haría el truco. –

+0

@SedateAlien Eso es verdad; si todas las claves son enter, entonces NSNumber es mejor porque es un tipo de datos más específico. Entonces, cualquier intento de crear un NSNumber a partir del tipo de datos incorrecto facilitaría la localización del problema. – bneely

5

Utilizo NSNumbers sin problemas, pero debo evitar los métodos habituales setObject: forKey: o . Eso crearía una advertencia.

Sin advertencia, sin embargo, se crea (y el código funciona como está previsto) con

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSNumber *key = @1; 
id *myObject = [your code here]; 
myDict[key] = myObject; 

recuperación es sencillo:

myObject = myDict[key]; 
Cuestiones relacionadas