2012-11-05 13 views
10

Sospetto che sia qualcosa di veramente semplice, ma sto cercando di ottenere un int che ho memorizzato in un dizionario e la riga sto usando questo .."Puntatore non compatibile alla conversione dei numeri interi che inizializza 'int' con un'espressione di tipo 'NSNumber *'"

int mapX = [NSNumber numberWithInt:[templateObject valueForKey:@"mapX"]]; 

Ma mi sta dando l'errore ...

puntatore Incompatibile a intero conversione invio di 'id' al parametro di tipo 'int'

e

puntatore incompatibile a integer conversione inizializzazione 'int' con un'espressione di tipo 'NSNumber *';

Se provo ...

NSNumber *mapX = [NSNumber numberWithInt:[templateObject valueForKey:@"mapX"]]; 

ho praticamente ottengo lo stesso errore. So che probabilmente sto usando la sintassi sbagliata, ma non sono sicuro di come altro scriverlo.

Grazie per qualsiasi aiuto.

risposta

26

Un paio di punti:

  • [NSNumber numberWithInt:[templateObject valueForKey:@"mapX"]];

    Restituisce un NSNumber*, che si sta cercando di conservare in un int.

  • NSNumber* mapX = [NSNumber numberWithInt:[templateObject valueForKey:@"mapX"]];

    non funziona neanche, perché non è un [templateObject valueForKey:@"mapX"]int. È possibile archiviare solo oggetti in NSDictionary, non in tipi primitivi.

Si potrebbe desiderare di provare (Supponendo che ho i tipi corrette)

NSNumber* mapXNum = [templateObject valueForKey:@"mapX"]; 
int mapX = [mapXNum intValue]; 
+0

"then [templateObject valueForKey: @" mapX "] non è neanche un int." - come potrebbe essere un intero ** del tutto? ** 'NSDictionary' può contenere solo oggetti, non scalari. –

+0

preposizione errata – WDUK

+0

"dovrebbe essere davvero [templateObject objectForKey: @" mapX "] se non si è certi che si sta usando la codifica del valore-chiave" - ​​questo è anche falso, 'NSDictionary' sovrascrive' - valueForKey: 'a è equivalente a '- objectForKey:' se la stringa chiave non inizia con un simbolo '@' (mi sembra che la stringa 'mapX' non inizi con uno). –

0
int mapX = [NSNumber numberWithInt:[templateObject valueForKey:@"mapX"]]; 

non ha senso per due motivi (si pensi per un momento), tuttavia

NSNumber *mapX = [NSNumber numberWithInt:[[templateObject valueForKey:@"mapX"] intValue]]; 

dovrebbe funzionare supponendo che [templateObject valueForKey:@"mapX"] sia un'istanza NSNumber o NSString.

0

Hai due problemi. Innanzitutto, [templateObject valueForKey:@"mapX"] restituisce un id, che è un puntatore a un oggetto Objective-C, non uno int. E poiché il metodo -[NSNumber numberWithInt:] accetta un parametro int, provare a convertire un valore in un int è un errore.

Il secondo problema è che si tenta di convertire il risultato di [NSNumber numberWithInt:...] ad un int, che è ancora una volta lo stesso problema: -[NSNumber numberWithInt:] restituisce un puntatore ad un oggetto NSNumber, che non è un int.

Partendo dal presupposto che il valore memorizzato nel vostro dizionario è infatti un NSNumber, cosa si vuole veramente fare è questo:

NSNumber *mapXObj = [templateObject valueForKey:@"mapX"]; // Implicit cast from id to NSNumber* 
int mapX = [mapXObj intValue]; 

O più brevemente:

int mapX = [[templateObject valueForKey:@"mapX"] intValue]; 
-1

Spero che questo sarà utile:

int mapX = [[templateObject valueForKey:@"mapX"] intValue]; 
+0

Vecchia risposta, ma non solo non è corretto ('valueForKey' può essere di qualsiasi tipo, ma molto probabilmente contiene un NSNumber, non un puntatore a un int), ma anche il tentativo di impostare una variabile di tipo scalare' int' su un puntatore scrivi 'int *' genererà un errore. – Tim

3
int mapX = (int)[[templateObject valueForKey:@"mapX"] integerValue]; 

la soluzione sopra sta assumendo il valore templateObjectForKey: @ "mapX" restituisce un NSNumber. Se non lo fa e si desidera convertirlo in un NSNumber, utilizzare questa soluzione al posto:

int mapX = (int)[(NSNumber *)[templateObject valueForKey:@"mapX"] integerValue]; 

Typecasting in objC è the.worst.

Problemi correlati