“指向使用 'NSNumber *' 类型的表达式初始化 'int' 的整数转换的不兼容指针”
Posted
技术标签:
【中文标题】“指向使用 \'NSNumber *\' 类型的表达式初始化 \'int\' 的整数转换的不兼容指针”【英文标题】:"Incompatible pointer to integer conversion initializing 'int' with an expression of type 'NSNumber *'"“指向使用 'NSNumber *' 类型的表达式初始化 'int' 的整数转换的不兼容指针” 【发布时间】:2012-11-05 18:37:29 【问题描述】:我怀疑这很简单,但我正在尝试获取存储在字典中的 int,而我正在使用的行是 this..
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];
【讨论】:
"那么 [templateObject valueForKey:@"mapX"] 也不是 int。" - 它怎么可能是整数?NSDictionary
只能保存对象,不能保存标量。
"应该真的是 [templateObject objectForKey:@"mapX"] 除非你确定你正在使用键值编码" - 这也是不正确的,NSDictionary
覆盖 - valueForKey:
一个它是等价的- objectForKey:
如果密钥字符串不以 @
符号开头(在我看来 mapX
字符串不以 1 开头)。
抱歉,您在valueForKey
上是正确的。谢谢提醒:)【参考方案2】:
int mapX = (int)[[templateObject valueForKey:@"mapX"] integerValue];
上述解决方案假设 templateObject valueForKey:@"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
对象的指针,它不是@987654332 @。
假设存储在您的字典中的值实际上是NSNumber
,那么您真正想要做的是:
NSNumber *mapXObj = [templateObject valueForKey:@"mapX"]; // Implicit cast from id to NSNumber*
int mapX = [mapXObj intValue];
或者更简洁:
int mapX = [[templateObject valueForKey:@"mapX"] intValue];
【讨论】:
以上是关于“指向使用 'NSNumber *' 类型的表达式初始化 'int' 的整数转换的不兼容指针”的主要内容,如果未能解决你的问题,请参考以下文章