我遇到了这段代码的问题:
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相关的指针,但我找不到任何相关的文档。)
答案 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;
您也可以通过不声明返回不同类型的同名方法来避免它。