2012-11-05 7 views
10

Podejrzewam, że jest to coś bardzo prostego, ale próbuję uzyskać int, które zapisałem w słowniku i linii Używam jest to .."Niekompatybilny wskaźnik do konwersji całkowitej inicjalizujący" int "z wyrażeniem typu" NSNumber * ""

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

Ale to daje mi błąd ...

Niezgodny wskaźnik do liczby całkowitej konwersji wysyłania 'id' do parametru typu 'int'

i

Niezgodny wskaźnik liczbę całkowitą konwersję inicjowanie 'int' z ekspresji typu 'NSNumber *';

Gdy próbuję ...

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

I w zasadzie ten sam błąd. Wiem, że prawdopodobnie używam niewłaściwej składni, ale nie jestem pewien, jak inaczej to napisać.

Dzięki za pomoc.

Odpowiedz

26

Kilka punktów:

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

    Zwraca NSNumber*, który próbujesz zapisać w int.

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

    nie będzie działać albo, ponieważ [templateObject valueForKey:@"mapX"] nie jest int. Obiekty można przechowywać tylko w NSDictionary, a nie w typach pierwotnych.

Możecie spróbować (Zakładając, że mam typy poprawne)

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

"wtedy [templateObject valueForKey: @" mapX "] również nie jest int." - w jaki sposób może być liczbą całkowitą **? '' NSDictionary' może przechowywać tylko obiekty, a nie skalary. –

+0

Przyimek o nieokreślonym brzmieniu – WDUK

+0

"powinien naprawdę być [templateObject objectForKey: @" mapX "], chyba że masz pewność, że używasz kodowania klucz-wartość" - to również nieprawda, 'nadpisania NSDictionary'' - valueForKey: 'a jest równoważne do '- objectForKey:' jeśli ciąg klucza nie zaczyna się od symbolu '@ '(wydaje mi się, że ciąg' mapX' nie zaczyna się od jednego). –

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

nie ma sensu z dwóch powodów (myślę o tym za chwilę), jednak

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

powinien działać, zakładając, że [templateObject valueForKey:@"mapX"] jest instancją NSNumber lub NSString.

0

Masz dwa problemy. Po pierwsze, [templateObject valueForKey:@"mapX"] zwraca wartość id, która jest wskaźnikiem do obiektu Objective-C, a nie int. A ponieważ metoda -[NSNumber numberWithInt:] przyjmuje parametr int, próba przekonwertowania id na int jest błędem.

Drugim problemem jest to, że starają się przekształcić wynik [NSNumber numberWithInt:...] do int, który jest ponownie ten sam problem: -[NSNumber numberWithInt:] zwraca wskaźnik do NSNumber obiektu, który nie jest int.

Zakładając, że wartość zapisana w słowniku jest w rzeczywistości NSNumber, co naprawdę chcesz zrobić to w ten sposób:

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

Albo bardziej zwięźle:

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

Mam nadzieję, że to będzie pomocne:

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

Stara odpowiedź, ale nie tylko jest niepoprawna ('valueForKey' może być dowolnego typu, ale najprawdopodobniej posiada NSNumber, a nie wskaźnik do int), ale także próbuje ustawić zmienną typu skalarnego' int' na wskaźnik wpisz 'int *' spowoduje błąd. – Tim

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

powyższe rozwiązanie zakłada wartość templateObjectForKey: @ "mapX" zwraca NSNumber. Jeśli tak się nie stanie i chcesz przekonwertować go do NSNumber, zamiast korzystać z tego rozwiązania:

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

Rzutowanie w ObjC jest the.worst.

Powiązane problemy