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

selectedHeight[[item selectedHeight] floatValue]NSNumber.

于 2008-11-20T22:38:18.767 に答える
7

以下のコードが iOS 6 SDK で機能することはわかっています。objオブジェクトには float 値が含まれていると仮定します。

id obj;
float fVal;

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

メソッドの宣言を確認する必要がありますselectedHeight。問題は、メソッドがオブジェクト (id) へのポインターを返しているか、コード スニペットを含むファイルにヘッダー ファイルをインポートしていないitemため、Xcode がデフォルトでポインターであると想定していることです。

基本的に互換性のない型であるため、ポインタを float にキャストすることはできません。宣言をまっすぐにしたら、大丈夫なはずです。

于 2008-11-20T22:38:10.280 に答える
1

複数のクラスが同じ名前のメソッドを宣言し、それらが異なる型を返す場合、コンパイラはそのような仮定を行います。「item」変数は「id」として型指定されているため、コンパイラは実行時にメッセージを送信するクラスを認識せず、いずれかを選択します。

この問題を回避するには、一般的な「id」の代わりに特定の型で宣言することにより、「item」がどのクラスのインスタンスであるかをコンパイラに通知できます。

SomeItemClass *item;

異なる型を返す同じ名前のメソッドを宣言しないことで、これを回避することもできます。

于 2008-11-20T22:39:10.763 に答える