2011-01-20 86 views
2

我需要調用一個類方法來運行Cocos2D場景。我有一個遊戲控制器,我將通過不同的狀態(或熟悉Cocos2D的圖層)。請參見下面的代碼:在類參數上調用類方法

-(void)startGameWithState:(Class)s { 
    [[CCDirector sharedDirector] runWithScene: [s scene]]; 
} 

的是,這是工作的罰款,但會生成以下警告:

No '+scene' method found 

儘可能最好的,我想避免的警告讓我怎麼解決這個問題?

更新:這就是我所做的。

-(void)changeStateTo:(Class <GameState>)s { 
    [[CCDirector sharedDirector] runWithScene: [s scene]]; 
} 

通過使用GameState協議定義+場景方法,我沒有收到任何警告。

+0

更多信息,與+現場屬於到我在運行時傳入的類,但編譯器在編譯時不知道,因此警告。 – Jaryl 2011-01-20 06:22:12

回答

2

基本上,只需用scene類方法聲明一個協議或抽象類,以便編譯器知道它存在。

0

它告訴你,你的泛型類型 - Class - 沒有一個叫做scene的方法。如果你在傳遞狀態/層次,那些必須是實際的類,對吧?您需要告訴編譯器s實際上是什麼類,以便它可以在其中找到scene方法。

+0

我明白了;閱讀我的評論。你如何告訴編譯器它將在運行時使用該方法,以便它不會給我警告? – Jaryl 2011-01-20 07:04:20

+0

`Class`不是Objective-C中的類;它是一種可以表示任何類的類型,例如對象的「id」。 Objective-C中沒有所有類屬於的泛型類。我想你在想Ruby,否則它有一個非常類似的類型系統。 – Chuck 2011-01-20 07:08:22

+0

我是一名紅寶石程序員,我意識到編譯器不知道我傳入的內容是一個+ scene方法,因爲它在編譯時給出警告,而Class在運行時傳遞。我正在尋找解決方案來克服警告;這段代碼工作正常。我需要通知編譯器,我知道我在做什麼,以便它可以停止發出警告。 – Jaryl 2011-01-20 07:41:35

-2

如果你將永遠傳遞具體類寫

-(void)startGameWithState:(ConcreteClass*)s 

如果要使用不同的類,沒有任何層次結構,它們之間用ID來避免該警告

-(void)startGameWithState:(id)s 

第二種方法是不是很好,因爲如果你將錯誤的類對象傳遞給這個方法,你會得到運行時錯誤。但在編制國家一切都會好起來

如果您知道通過每一個類從一個+(id) scene方法的一些基類派生然後通過基類:

-(void)startGameWithState:(BaseClass*)s 
相關問題