2012-02-16 4 views
0

私は、なぜ私が最初から文字列であるときに変数を再キャストする必要があるのか​​理解する助けが必要だと思っていました。ここでNSStringはなぜそれを「忘れる」のですか?

はコードです:

+ (BOOL)hasOperandComponents:(NSString *)operandToTest 
{ 
    NSArray *componentsOfOperand = [[NSString stringWithFormat:@"%@",operandToTest] componentsSeparatedByString:@" "]; 
    if (componentsOfOperand.count>1) return YES; return NO; 
} 

私は「stringWithFormat」に埋め込まれたコールを使用しない場合、私はむしろ一般的なエラーが発生します。

-[__NSCFNumber componentsSeparatedByString:]: unrecognized selector sent to instance 

私は答えを見つけることができました私のoperandToTestがNSStringであり、_NSCFNumberになっていることを「忘れている」ように見える理由について、このエラーが意味するものとそれに伴う回避方法(上記の私のコードを参照してください)は他のQとAを検索しています。

これはクラスメソッドなので疑問がありますが、NSString * operandToTestの特定のインスタンスがクラスメソッドに渡されるとどうなるのですか?

助けてください?

+1

operandToTestが実際にはNSStringであることを完全に確信していますか?あなたはNSNumberをどこかに渡していませんか?また、ゾンビを有効にして実行しようとしましたか? –

+1

デバッガで停止し、 'print operandToTest'を実行することができます。 '$ 1 =(NSNumber *)0x12345678'や' $ 1 =(NSString *)0x12345678'のようなものでなければなりません。それはオブジェクトが実際に何であるかを教えてくれるでしょう。 – user1118321

+0

渡された値が数値であることがあります。私は数字、演算子、変数のid * NS配列を食べていますが、渡す変数は次のように設定されています。 'NSString * secondOperand = [self descriptionOfTopOfStack:stack];' 私はすでにすべてをストリングにキャストしていませんか? –

答えて

2

問題は、まずは文字列がないことです。 operandToTestとしてメソッドに渡す値は、実際にはNSNumber*です。これがなぜであるかを知るためには、呼び出し関数を見る必要があります。

+0

あなたの問題を理解するのを助けることができるように、私は私のポストの更新の一部として私の呼び出し関数を読んだことを証明していました...私は実際に配列要素をintrospectingしていました。私が精神的に思っていたようにNSNumberからNSStringにキャストするのではなく、変数に渡します.Opps 私の呼び出し元で問題を「修正」できるかどうかを今すぐ確認してください:-) –

+0

@ user1215012:とにかくそれを「NSNumber」から「NSString」に「キャスト」します。それは実際に関数に渡したときに行ったことです。キャストはオブジェクトを変更するものではなく、コンパイラがそのオブジェクトを考えるものを変更するだけです。あなたがしなければならないことは、あなたが選んだ方法でそれを変換することです。 –

+0

それを修正しました - ケビンとCatfish_Manありがとうございました... Oppsはキャストしません...私はNSNumberを扱っていたことを確認するためにイントロスペクションを使用しましたが、実際にstringWithFormat :-)を使って(新しい部分) –

関連する問題