"Несовместимый указатель на целочисленное преобразование, инициализирующее" 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];