web-dev-qa-db-ja.com

idをfloatにキャストするにはどうすればよいですか?

私はこのコードに問題があります:

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に関連するポインターの解決に関係していると思われますが、関連するドキュメントが見つかりません)。

17
Benedict Cohen

あなたが欲しい[[item selectedHeight] floatValue]、selectedHeightがNSNumberを返すと仮定します。

39
e.James

以下のコードがiOS6SDKで機能することを知っています。 objオブジェクトにfloat値が含まれていると仮定します。

id obj;
float fVal;

fVal = [obj floatValue];
7
csonuryilmaz

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

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

1

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

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

SomeItemClass *item;

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

1
Sherm Pendley