开发者

Calling class method on a class parameter

开发者 https://www.devze.com 2023-02-05 21:47 出处:网络
I need to call a class method to run a Cocos2D scene. I have a game controller in which I will pass in different states (or layers for those familiar with Cocos2D). See the code below:

I need to call a class method to run a Cocos2D scene. I have a game controller in which I will pass in different states (or layers for those familiar with Cocos2D). See the code below:

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

The thing is, this is working fine but generates the following warning:

No '+scene' method found

As best as possible, 开发者_JAVA百科I want to avoid having warnings so how do I fix this?

Update: This is what I did.

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

By having the GameState protocol define the +scene method, I don't get any warnings.


Basically, just declare a protocol or abstract class with the scene class method so the compiler knows it exists.


It's telling you that your generic type -- Class -- doesn't have a method called scene. If you're passing in states/layers, those must be of some actual class, right? You need to tell the compiler what class s actually is so that it can find the scene method in it.


If you will always pass concrete class the write

-(void)startGameWithState:(ConcreteClass*)s

If you will use different classes without any hierarchy between them use id to avoid the warning

-(void)startGameWithState:(id)s

The second method is not very good because if you will pass the incorrect class object to this method you'll get runtime error. But at the compiling state everything will be fine

If you know that every class passed will be derived from some base class with a +(id) scene method then pass the base class:

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

精彩评论

暂无评论...
验证码 换一张
取 消