2016-09-23 8 views
-1

私はCardというクラスと、PlayingCardと呼ばれるCardのサブクラスを持っています。 ViewControllerでは、私は引数としてCardを取るメソッドを持っています。オブジェクト-cのオブジェクトキャスト

ような何か:私はPlayingCardcardを投げかけている

- (void)doSomething: (Card *) card 
{ 
    card = (PlayingCard *)card; 
    NSString *aProperty = card.aPropertyOfPlayingCard; // complained 
    // ... 
} 

。なぜXcodeのは、と文句を言うだろう:

「プロパティ「aPropertyOfPlayingCardオブジェクト型には見られない 『カード*』」

答えて

3

を変数cardは一度だけ宣言することができます。あなたのコードでは、メソッドの引数としてcardが渡されます。タイプキャストでそのクラスの他のオブジェクトを割り当てても、この変数は元々宣言された型の変数として解釈されます。あなたはタイプPlayingCardの新しい変数を作成し、型キャストを使用して、それにインスタンスcardを割り当てることができます:

- (void)doSomething: (Card *) card 
{ 
    PlayingCard *playingCard = (PlayingCard *)card; 
    NSString *aProperty = playingCard.aPropertyOfPlayingCard; 
    //... 
} 

編集

しかし、あなたはcardとしてメソッドに渡されたインスタンスは異なるものになることを、認識しておく必要がありPlayingCardクラスインスタンスよりも、getterを実装していない可能性があります。aPropertyOfPlayingCardこの場合、aPropertyを呼び出すと、「インスタンス0xに送信された認識できないセレクタ...」例外がスローされます。

if([card isKindOfClass:[PlayingCard class]]) { 
    PlayingCard *playingCard = (PlayingCard *)card; 
    NSString *aProperty = playingCard.aPropertyOfPlayingCard; 
} 
+1

"この場合、aプロパティがnilである可能性があります"が間違っています。この場合、「インスタンスに送信されたセレクタを認識できません...」という例外が発生します。 – Willeke

+0

@Willekeあなたは正しいです。私は無限オブジェクトのメソッドを呼び出すと間違っています(これは有効です)。 "aProperty"は既存のオブジェクトである可能性が高いため、これは異なります。 – Greg

関連する問題