"Несовместимый указатель на целочисленное преобразование, инициализирующее" int "с выражением типа" NSNumber * ""

Я подозреваю, что это что-то очень простое, но я пытаюсь получить int, который я сохранил в словаре, а строка, которую я использую, - это...

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

Но это дает мне ошибку...

Несовместимый указатель на целочисленное преобразование, отправляющее 'id' в параметр типа 'int'

и

Несовместимый указатель на целочисленное преобразование, инициализирующее 'int' с выражение типа "NSNumber *";

Если я попытаюсь...

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

В основном я получаю ту же ошибку. Я знаю, что я, вероятно, просто использую неправильный синтаксис, но я не уверен, как это записать.

Спасибо за любую помощь.

Ответ 1

Несколько пунктов:

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

    Возвращает NSNumber*, который вы пытаетесь сохранить в int.

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

    тоже не будет работать, потому что [templateObject valueForKey:@"mapX"] не является int. Вы можете хранить объекты только в NSDictionary, а не в примитивных типах.

Возможно, вы захотите попробовать (предположим, что у меня есть правильные типы)

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

Ответ 2

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

приведенное выше решение принимает значение templateObjectForKey: @ "mapX" возвращает NSNumber. Если это не так, и вы хотите преобразовать его в NSNumber, используйте это решение вместо:

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

Типизация в ObjC - это.

Ответ 3

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

не имеет смысла по двум причинам (подумайте об этом на мгновение), однако

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

должен работать, предполагая, что [templateObject valueForKey:@"mapX"] является экземпляром NSNumber или NSString.

Ответ 4

У вас две проблемы. Во-первых, [templateObject valueForKey:@"mapX"] возвращает id, который является указателем на объект Objective-C, а не int. А поскольку метод -[NSNumber numberWithInt:] принимает параметр int, попытка преобразования id в int является ошибкой.

Вторая проблема заключается в том, что вы пытаетесь преобразовать результат [NSNumber numberWithInt:...] в int, что опять та же проблема: -[NSNumber numberWithInt:] возвращает указатель на объект NSNumber, который не является int.

Предполагая, что значение, хранящееся в вашем словаре, на самом деле является NSNumber, вы действительно хотите это сделать:

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

Или более лаконично:

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

Ответ 5

Я надеюсь, что это будет полезно:

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