2009-10-22 10 views
12

El siguiente fragmento de código:Cómo establecer correctamente un valor entero en NSDictionary?

NSLog(@"userInfo: The timer is %d", timerCounter); 

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:timerCounter] forKey:@"timerCounter"]; 

NSUInteger c = (NSUInteger)[dict objectForKey:@"timerCounter"]; 
NSLog(@"userInfo: Timer started on %d", c); 

produce una salida a lo largo de las líneas de: (. Fwiw, timerCounter es una NSUInteger)

2009-10-22 00:36:55.927 TimerHacking[2457:20b] userInfo: The timer is 1 
2009-10-22 00:36:55.928 TimerHacking[2457:20b] userInfo: Timer started on 5295968 

Estoy seguro de que me falta algo bastante obvio, simplemente no estoy seguro de qué se trata.

Respuesta

22

Debe utilizar intValue del objeto recibido (un NSNumber), y no usar un yeso:

NSUInteger c = [[dict objectForKey:@"timerCounter"] intValue]; 
+5

En realidad, para NSUInteger, debe usar '-unsignedIntegerValue'. –

+2

(Y '+ [NSNumber numberWithUnsignedInteger:]' para crear el NSNumber, si realmente debe estar sin firmar.) – Wevah

+0

Puede usar '@ (timerCounter)' en lugar de '[NSNumber numberWithInteger: timerCounter]' – fpg1503

11

Diccionarios siempre se almacenan los objetos. NSInteger y NSUInteger no son objetos. Su diccionario está almacenando un NSNumber (¿recuerde que [NSNumber numberWithInteger:timerCounter]?), Que es un objeto. Entonces, como dijo epatel, debe solicitar al NSNumber su unsignedIntegerValue si desea un NSUInteger.

0

O como este con literales:

NSUInteger c = ((NSNumber *)dict[@"timerCounter"]).unsignedIntegerValue; 

Debe elegida como NSNumber primero como objeto retirado del diccionario será id_nullable por lo que no responderá al valor de la conversión de métodos.

Cuestiones relacionadas