无法在字典中存储int或double

时间:2011-05-26 22:43:04

标签: objective-c

当尝试在字典中存储double或int时,我收到错误

  

错误:语义问题:将'double'发送到不兼容类型'id'的参数

我有以下代码

[data setValue:longitude forKey:@"longitude"];
经度是双倍的。

我该怎么存储?我应该只创建一个指向int或double的指针吗?

5 个答案:

答案 0 :(得分:22)

正如其他帖子所述,您需要使用NSNumber将double值包装在对象中。这样做的原因是所有Cocoa基础集合类都设计为使用对象而不是原始值。正如你的建议,通过一些工作,你实际上可以传递一个指向double值的指针(我想,如果你设法将它转换为id类型指针),但是只要你的方法完成并且双重去了超出范围它将被释放,你的指针现在将指向垃圾。对于一个对象,集合(在这种情况下为NSDictionary)将在添加对象时保留对象,并在删除对象时将其释放或集合为dealloc,以确保您的价值能够存活直到您不知道为止不再需要了。

我会这样做:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];
[data setValue:tempNumber forKey:@"longitude"];
[tempNumber release];

这将使您的NSNumber对象只有+1引用计数(保留它的字典)并且没有自动释放

另一种建议的做法:
[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
也可以正常工作但你的对象最终会得到+1引用计数和numberWithDouble方法的自动释放。在可能的情况下,我尽量避免自动释放,但代码更简洁。 YMMV。

答案 1 :(得分:6)

尝试使用NSNumber:

[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];

答案 2 :(得分:3)

字典需要NSObject,而不是数字或指针。但是,创建一个包含数字的对象很容易:

NSNumber *mylongitudeObject = [NSNumber numberWithDouble:myLongitude];

你可以存储在NSDictionary中。

引擎盖下:mylongitudeObject实际上是指向包含您的号码副本的不透明结构的指针;但该结构还包含信息,以便Objective C运行时知道它可以对此对象做什么,例如如何将其复制到字典中等。

答案 3 :(得分:2)

您必须使用NSNumber对象。尝试按如下方式声明经度

NSNumber longitude = [NSNumber numberWithDouble:myLongitude]

答案 4 :(得分:1)

使用较新版本的编译器,您可以使用Objective-C文字语法从double类型的变量创建NSNumber:

double longitude = 2.0;
dict[@"longitude"] = @(longitude);