参数1的不兼容类型Objective-C

时间:2011-04-22 20:59:16

标签: objective-c cocoa-touch ios4 dynamic arguments

我有一个在Core Data商店中设置实体的函数。我曾经将它存储的所有值都存储为double类型,但是现在我必须使它适应NSStrings。因此,我将函数所接受的参数类型更改为id类型。但是,现在我收到了错误:

error: incompatible type for argument 1 of 'numberWithDouble:'

......在以下几行:

//...
[dfm setTimeStamp:[NSNumber numberWithDouble:value]];
//...
[[fetchedObjects objectAtIndex:0] setValue:[NSNumber numberWithDouble:value] forKey:@"timeStamp"];
//...

显然它不喜欢每行的[NSNumber numberWithDouble:value]段。我正在考虑制作一个容纳NSNumber类型的容器类(不是Apple已经有类似这样的类吗?)来解决这个问题,但我认为必须有一个更容易的方法我不会想到(除了重复函数和更改值参数的类型)。有任何想法吗?提前谢谢!

编辑:

这是函数声明:

-(void)setItemInDFMWhilePreservingEntityUniquenessForItem:(attribute)attr withValue:(id)value

attribute只是一个枚举,用于指定要存储的实体。问题是编译器给我的值是id类型的问题,理论上我可以传递任何我想要的东西,我相信我拥有它的方式我暗示我将它作为NSNumber传递,但编译器不喜欢那样,因为我认为它实际上不是一个类实例?

4 个答案:

答案 0 :(得分:3)

  

问题是编译器是   给我带来价值的问题   输入id,理论上我可以传入   我想要的任何东西,我相信的方式   我拥有它我暗示我会   将它作为NSNumber传递,但是   编译器不喜欢那样   实际上并不是一个类实例我   假设

通过将value声明为id,您可以传递所需的任何对象。但是,当你将clearly documented作为一个对象时,为什么“假设”NSNumber不是一个对象呢?当你将value声明为id时,警告不是关于传递NSNumber实例 - 这是完全有效的,因为id表示“任何对象”,而NSNumber实例是一个对象。警告来自调用+numberWithDouble:,这是一种方法,它的第一个参数为double,并传递value,它被声明为id - 即一个对象。您不能将对象传递给期望double的方法。

您提出的解决方案,使用(NSInteger)value进行类型转换将使警告静音,但它无法解决问题。类型转换只是将对象指针所指向的内存地址转换为整数值。如果(正如您的编辑所示)值已经是NSNumber对象,您希望通过创建另一个或通过将其内存地址类型转换为整数来获得什么?只是做:

[dfm setTimeStamp:value];

答案 1 :(得分:1)

问题在于价值变量。它应声明为此调用成功的双(原始)。

编辑:在重新阅读你的问题之后,检查一下value类型的函数,如果它是一个NSString(使用[value isKindOfClass:[NSString class]])存储它,如果它不是那么它double(如果那是你传递的只有两种类型)并将其存储起来。

答案 2 :(得分:0)

你不能只传递NSNumber而不是double吗?

答案 3 :(得分:0)

刚刚意识到我正在进行的调用(numberWithDouble:)正在让编译器检查一个原语,即double。将其更改为以下内容就像一个魅力:

[dfm setTimeStamp:[NSNumber numberWithInteger:(NSInteger)value]];

感谢那些回复!