2011-06-18 15 views
1

は、次のコードを考えてみましょう。 ifステートメントはobjNSStringクラスであるかどうかをチェックします。そうであれば、それはオブジェクトと追加された文字列をNSString *sに割り当てます。これは正しく理解できますか?もしそうなら、あなたはまだそれを(NSString *)にキャストしますか? ifステートメントはすでにそれをチェックしていないので、型キャストを不要にしていませんか?基本Objective-Cの型キャストの質問

はそれだけで言うのは完全に罰金ではないでしょう:事前に

NSString *s = obj stringByAppendingString:@"xyzzy"];

感謝。

+1

isKindOfClass: 'ベースのコーディングを行うことは非常に非典型的です。指定されたオブジェクト参照が実際にどのような型であるのかわからない場合、これは一般的に厄介なアーキテクチャを示します。 – bbum

+0

私は参照してください。これはCS193Pスライドの一例です。あなたのコメントを心に留めておきます!ありがとう。 – cabaret

+0

@bbum私はそう言っていないでしょう。 'isKindOfClass:'が意味を成す多くの正当なユースケースがあります。例えば。あるメソッドは、呼び出し側が未知のクラスの引数を提供する必要があります。その場合、メソッド定義で 'id'" class "を使用し、それに応じて異なる型を扱うために' isKindOfClass: 'に頼ります。 –

答えて

3

すべてはどのようにobjが定義されているかによって異なります。 id objの場合、キャストは必要ありませんが、NSObject *objと定義されている場合は、であり、stringByAppendingString:NSObjectに定義されていないというコンパイラの警告を抑制するために必要です。キャストは実行時にコードを動作させるために必要ではなく、メソッドがオブジェクトに存在するかどうかを知ることができるように、コンパイラに「正しい」型だけを伝えます。

NSObject *は「タイプNSObjectののオブジェクトを」を意味しidは、「任意の型のオブジェクトを」を意味するので、キャストがidのために必要されていない理由はあります。

+0

「id」については理解していると思います。しかし、 'NSObject * obj'として定義されたオブジェクトはここでif節をどのように渡しますか? NSStringクラスのテストですね。または、 'NSString'が' NSObject'から継承するので、それは合格でしょうか? – cabaret

+0

'obj'は' NSString'を含んでいる可能性があります。 'NSString'はNSObject'から派生しているからです。しかし、コンパイラは、 'if'(' isKindOfClass: 'は' NSObject'で定義されたメソッドの1つ)の時に 'NSObject'メソッドについて知っているだけで、定義されている追加のメソッドについてはまだ知りません'NSString'クラスにあります。 'if'は' obj'のオブジェクトが単に 'NSObject'以上であるかどうかをチェックし、実際に' NSString'かどうかをチェックします。チェックが成功した場合は、それがNSStringであることがわかりました。そして今、あなたはキャストでそのように扱うようにコンパイラに指示する必要があります。 – DarkDust