2012-02-12 13 views
8

Sto provando ad accedere al mio oggetto dizionario. Qui è il mio codice:Utilizzo di int come chiave NSDictionary?

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

Il problema è objectForKey dovrebbe prendere un oggetto Objective-C, non è un int. Ho provato a racchiudere tag in un NSNumber con [NSNumber numberWithInt:tag] e passandolo a objectForKey: ma restituisce un oggetto nullo.

Qualche idea? Grazie

+3

Come ha messo gli oggetti in 'self.dict' in il primo posto? – mattjgalloway

+0

initWithObjectsAndKeys: [valore NSValueWithCGPoint: CGPointMake (1,2)], @ "100", ecc. Si noti che il mio dizionario va bene, sto accedendo in altre parti del mio codice con un for-in (per la chiave id in self.dict) ciclo. Tuttavia in questo caso non voglio usare un ciclo. Grazie – user339946

risposta

13

Se si utilizza i numeri come stringhe per le chiavi del dizionario, si dovrebbe trasformare il int in un NSString o NSNumber di utilizzarlo come chiave del dizionario. Ecco come si fa per una stringa:

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

Come @Hughes BR menziona in un commento, l'obbligo per l'oggetto chiave è che deve essere conforme al protocollo NSCopying.

+0

Ciao, ho impostato manualmente il mio object.tag su 100, 101, ecc. I tasti del dizionario sono scritti come @ "101". Nota che ho avuto accesso al dizionario con successo in altre parti del mio codice, in particolare quando ho usato un ciclo for-in. I miei oggetti e le chiavi del dizionario sono tutti lì. – user339946

+15

Non è necessario utilizzare una stringa. Un "NSNumber" sarebbe sufficiente e sarebbe potenzialmente più naturale. '[NSNumber numberWithInteger: [object tag]]' farebbe il trucco. –

+0

@SedateAlien È vero; se tutte le chiavi sono ints, allora NSNumber è migliore perché è un tipo di dati più specifico. Quindi, qualsiasi tentativo di creare un NSNumber dal tipo di dati errato renderebbe facile individuare il problema. – bneely

5

Io uso NSNumbers senza problemi, ma devo evitare i soliti metodi setObject: forKey: o setValue: forKey:. Ciò creerebbe un avvertimento.

Nessun avvertimento, però, si crea (e il codice funziona come previsto) con

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

recupero è semplice:

myObject = myDict[key]; 
Problemi correlati