2011-01-20 5 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プロトコルで+ sceneメソッドを定義することで、警告が表示されません。

+0

詳細情報を、+シーンが所属:しかしでコンパイル状態のすべてがあなたが渡されたすべてのクラスは、基本クラスを渡し、その後+(id) scene方法でいくつかの基本クラスから派生されることがわかっている場合

罰金になります実行時にクラスに渡しますが、コンパイラはコンパイル時にはそれを知りませんので、警告を出します。 – Jaryl

答えて

2

基本的に、sceneクラスメソッドでプロトコルまたは抽象クラスを宣言するだけで、コンパイラはそれが存在することを知ることができます。

+0

私はプロトコルを使用することを考えていましたが、おそらくあなたの方法ではありませんでした。とにかく、私は最終的な解決策で質問を更新します。 – Jaryl

0

genericタイプのClassには、sceneというメソッドがありません。あなたが州/層を渡しているなら、それらは実際のクラスのものでなければなりません、そうですか?どのようなクラスsが実際にあるのかをコンパイラに伝え、sceneメソッドが見つかるようにする必要があります。

+0

私はそれを得る。私のコメントを読んでください。どのようにコンパイラに実行時にメソッドを持たせるように指示するので、警告が表示されません。 – Jaryl

+0

'Class'はObjective-Cのクラスではありません。それはオブジェクトのための 'id'のようなどんなクラスも表すことができるタイプです。 Objective-Cにはすべてのクラスが属している汎用クラスはありません。私はRubyについて考えていると思いますが、それ以外の場合は非常によく似たタイプのシステムを持っています。 – Chuck

+0

私はRubyプログラマです。コンパイラは、クラスが実行時に渡される間、コンパイル時に警告を出すので、渡しているものが+シーンメソッドを持っていることを知らないことに気付いています。私は警告を克服するための解決策を探しています。このコードは完全に機能しています。コンパイラに警告して、警告を出さないようにしていることを認識している必要があります。 – Jaryl

-2

あなたは第二の方法は非常にではありません

-(void)startGameWithState:(id)s 

警告を回避するために、IDを使用して、それらの間の任意の階層せずに別のクラスを使用する場合は、常に書き込み

-(void)startGameWithState:(ConcreteClass*)s 

具象クラスを渡します場合これは間違ったクラスオブジェクトをこのメソッドに渡すと実行時エラーが発生するからです。

-(void)startGameWithState:(BaseClass*)s 
+0

私はクラスのインスタンスを渡していません。私はクラスそのものを渡したい。これは、+シーンメソッドがインスタンス化を担当するためです。 – Jaryl

関連する問題