如何将id转换为浮点数?

时间:2008-11-20 22:31:34

标签: objective-c macos casting

我遇到了这段代码的问题:

NSRect itemFrame;
id item;
// code to assign item goes here.
itemFrame.origin.y -= [item respondsToSelector:@selector(selectedHeight)] ? [item selectedHeight]   : [self defaultSelectedHeight];

这是有问题的一点:

[item selectedHeight]

编译器假设返回类型为id。我虽然添加一个演员会解决这个问题:

(float)[item selectedHeight]

但它不起作用。

我做错了什么? (我怀疑问题是解决与id相关的指针,但我找不到任何相关的文档。)

4 个答案:

答案 0 :(得分:37)

您希望[[item selectedHeight] floatValue],假设selectedHeight返回NSNumber

答案 1 :(得分:6)

我知道下面的代码适用于iOS 6 SDK。我假设 obj 对象包含一个浮点值。

id obj;
float fVal;

fVal = [obj floatValue];

答案 2 :(得分:1)

您需要查看selectedHeight方法的声明。问题是该方法返回指向对象(id)的指针,或者您没有在包含代码片段的文件中导入item的头文件,因此Xcode默认它是一个指针

您不能将指针强制转换为浮点数,因为它们基本上是不兼容的类型。一旦你的声明得到理顺,你应该没事。

答案 3 :(得分:1)

当多个类声明具有相同名称的方法时,编译器会进行这种假设,这些方法返回不同的类型。由于您的“item”变量被输入为“id”,因此编译器不知道它将在运行时将消息发送到哪个类中,并选择一个。

要避免此问题,您可以通过使用特定类型而不是通用“id”声明它来通知编译器“item”类的实例:

SomeItemClass *item;

您也可以通过不声明返回不同类型的同名方法来避免它。