当尝试在字典中存储double或int时,我收到错误
错误:语义问题:将'double'发送到不兼容类型'id'的参数
我有以下代码
[data setValue:longitude forKey:@"longitude"];
经度是双倍的。
我该怎么存储?我应该只创建一个指向int或double的指针吗?
答案 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);