2012-11-05 7 views
10

Ich vermute, das ist etwas wirklich einfaches, aber ich versuche, ein int, dass ich in einem Wörterbuch und der Zeile gespeichert habe ich verwende das ist .."Inkompatibler Zeiger auf Integer-Konvertierung Initialisierung von 'int' mit einem Ausdruck vom Typ 'NSNumber *'"

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

Aber es gibt mir den Fehler ...

Inkompatible Zeiger Umwandlung in integer 'id' Senden vom Typ Parameter 'int'

und

Unverträgliche pointer Umwandlung in Integer 'int' mit einem Ausdruck des Typs 'NSNumber *' initialisieren;

Wenn ich versuche, ...

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

ich im Grunde die gleichen Fehler. Ich weiß, dass ich wahrscheinlich nur die falsche Syntax verwende, aber ich bin mir nicht sicher, wie ich es sonst schreiben soll.

Danke für jede Hilfe.

Antwort

26

Ein paar Punkte:

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

    Gibt ein NSNumber*, die Sie in einem int zu speichern versuchen.

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

    entweder nicht funktioniert, weil [templateObject valueForKey:@"mapX"] kein int ist. Sie können Objekte nur in NSDictionary, nicht primitiven Typen speichern.

Sie vielleicht ausprobieren möchten (ich habe die Typen Unter der Annahme, richtig)

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

"dann ist [templateObject valueForKey: @" mapX "] auch kein int." - Wie könnte es überhaupt eine Ganzzahl sein? ** "NSDictionary" kann nur Objekte enthalten, keine Skalare. –

+0

Falsche Präposition – WDUK

+0

"sollte eigentlich [templateObject objectForKey: @" mapX "] sein, es sei denn, Sie sind sicher, dass Sie eine Schlüsselwertkodierung verwenden" - dies ist auch nicht wahr, 'NSDictionary' überschreibt' - valueForKey: 'ein äquivalent zu '- objectForKey:' wenn die Schlüsselzeichenfolge nicht mit einem '@' Symbol beginnt (es scheint mir, dass die 'mapX' Zeichenfolge nicht mit einer beginnt). –

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

macht keinen Sinn, aus zwei Gründen (man denke über sie für einen Moment), aber

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

sollte funktionieren unter der Annahme [templateObject valueForKey:@"mapX"] ist entweder eine NSNumber oder eine NSString Instanz.

0

Sie haben zwei Probleme. Zunächst gibt [templateObject valueForKey:@"mapX"] einen id zurück, der ein Zeiger auf ein Objective-C-Objekt ist, nicht ein int. Und da die -[NSNumber numberWithInt:]-Methode einen int-Parameter annimmt, ist der Versuch, eine id in eine int zu konvertieren, ein Fehler.

Das zweite Problem ist, dass Sie versuchen, das Ergebnis von [NSNumber numberWithInt:...] zu einem int, was wiederum das gleichen Problem zu konvertieren: -[NSNumber numberWithInt:] einen Zeiger auf ein NSNumber Objekt zurückgibt, das kein int ist.

Unter der Annahme, dass der Wert in Ihrem Wörterbuch gespeichert ist in der Tat ein NSNumber, was Sie wirklich wollen, ist dies:

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

Oder kurz und bündig:

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

ich diese Hoffnung wird hilfreich:

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

Alte Antwort, aber das ist nicht nur falsch ('valueForKey' könnte ein beliebiger Typ sein, sondern enthält höchstwahrscheinlich eine NSNumber, nicht einen Zeiger auf ein int), sondern versucht auch, eine Variable vom Skalartyp 'int' auf einen Zeiger zu setzen type 'int *' wird einen Fehler auslösen. – Tim

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

Die obige Lösung geht von templateObject valueForKey aus: @ "mapX" gibt eine NSNumber zurück. Wenn es nicht der Fall ist und Sie wollen es konvertieren zu einem NSNumber, verwenden Sie diese Lösung statt:

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

Typecasting in ObjC the.worst ist.

Verwandte Themen