17

我在使用此代码时遇到问题:

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

4 回答 4

39

你想要[[item selectedHeight] floatValue],假设 selectedHeight 返回一个NSNumber.

于 2008-11-20T22:38:18.767 回答
7

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

id obj;
float fVal;

fVal = [obj floatValue];
于 2012-10-19T14:53:58.043 回答
1

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

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

于 2008-11-20T22:38:10.280 回答
1

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

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

SomeItemClass *item;

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

于 2008-11-20T22:39:10.763 回答