“指向使用 '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"]NSNumberNSString 实例应该可以工作。

【讨论】:

【参考方案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' 的整数转换的不兼容指针”的主要内容,如果未能解决你的问题,请参考以下文章