2016-09-23 151 views
-1

我有一個叫做Card的類和一個叫做PlayingCardCard的子類。 在ViewController中,我有一個將Card作爲參數的方法。對象鑄造目標-c

喜歡的東西:

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

我已經投了cardPlayingCard。爲什麼Xcode中抱怨說:

回答

3

變量card只能進行一次申報「房產證*‘「aPropertyOfPlayingCard沒有對象類型中發現’」。在您的代碼中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

「在這種情況下aProperty可能爲零」是錯誤的。在這種情況下,您會收到一個異常「發送給實例的無法識別的選擇器...」。 – Willeke

+0

@Willeke你是對的。我錯誤地調用了一個無對象的方法,(這將是有效的)。這是不同的,因爲「aProperty」可能是一個現有的對象。 – Greg