2011-05-26 7 views
13

Cuando se trata de almacenar un doble o un int en un diccionario me sale un errorint tienda de canto o doble en el diccionario de

error: Semantic Issue: Sending 'double' to parameter of incompatible type 'id'

tengo el siguiente código

[data setValue:longitude forKey:@"longitude"]; 

longitud es un doble.

¿Cómo debo guardar esto? ¿debería simplemente crear un puntero a un int o un doble?

Respuesta

20

Como los otros mensajes han dicho, es necesario utilizar un NSNumber para envolver su doble valor en un objeto. La razón de esto es que todas las clases de colección de la base Cocoa están diseñadas para trabajar con objetos en lugar de valores primitivos. Como sugirió, con algo de trabajo podría pasar un puntero a un valor doble (creo que si lo logró como un puntero de tipo id), pero tan pronto como su método finalizó y el doble salió del alcance sería lanzado y su puntero ahora estaría apuntando a la basura. Con un objeto, la colección (NSDictionary, en este caso) conservará su objeto cuando se agregue y lo liberará cuando se elimine o la colección estará dealloc 'ed, asegurando que su valor sobreviva hasta que ya no lo necesite.

lo haría de la siguiente manera:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];
[data setValue:tempNumber forKey:@"longitude"];
[tempNumber release];

que dejará su objeto NSNumber con sólo una cuenta de referencia 1 (el diccionario retenerlo) y no hay autoreleases

El otro método sugerido de hacer:
[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
también funcionará bien, pero su objeto terminará con recuento de referencias +1 y liberación automática desde el método numberWithDouble. Cuando es posible, trato de evitar las autorreleas, pero el código es más conciso. YMMV.

+1

[NSNumber numberWithDouble:] es un objeto autoreleased ... medida que se forma a partir de un método de la clase conveniencia, y por convención aquellos son devueltos como Autorrellezado. –

2

Debe usar un objeto NSNumber en su lugar. Trate de longitud que se declara de la siguiente manera

NSNumber longitude = [NSNumber numberWithDouble:myLongitude]

6

Trate de usar un NSNumber:

[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
3

Un diccionario quiere un NSObject, no un número o un puntero. Sin embargo, es fácil crear un objeto que contiene un número:

NSNumber *mylongitudeObject = [NSNumber numberWithDouble:myLongitude]; 

que se puede almacenar allí en un NSDictionary.

Debajo del capó: mylongitudeObject en realidad será un puntero a una estructura opaca que contiene una copia de su número; pero la estructura también contiene información para que el tiempo de ejecución de Objective C sepa qué puede hacer con este objeto, como cómo copiarlo en un diccionario, etc.

0

Con la versión más reciente del compilador, puede usar el objetivo sintaxis literal -C para crear un NSNumber de una variable de tipo doble:

double longitude = 2.0; 
dict[@"longitude"] = @(longitude); 
Cuestiones relacionadas