2011-01-20 2 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

Больше информации, то + сцена принадлежит к классу, который я передаю во время выполнения, но компилятор не будет знать во время компиляции, следовательно, это предупреждение. – Jaryl

ответ

2

В принципе, просто объявите протокол или абстрактный класс с помощью метода класса scene, чтобы компилятор знал, что он существует.

+0

Я думал об использовании протоколов, но, возможно, не так, как вы делали. Во всяком случае, я уточню вопрос с окончательным решением. – Jaryl

0

Это говорит вам, что ваш общий тип - Class - не имеет метода под названием scene. Если вы проходите в состояниях/слоях, они должны быть определенного класса, верно? Вы должны сообщить компилятору, что класс s действительно так, чтобы он мог найти в нем метод scene.

+0

Я получаю это; прочитайте мой комментарий. Как вы сообщаете компилятору, что он будет иметь метод во время выполнения, чтобы он не дал мне предупреждение? – Jaryl

+0

'Класс' не является классом в Objective-C; это тип, который может представлять любой класс, например 'id' для объектов. В Objective-C нет универсального класса, в котором все классы принадлежат. Я думаю, вы думаете о Ruby, который в противном случае имеет очень похожую систему типов. – Chuck

+0

Я рубиновый программист, и я знаю, что компилятор не знает, что то, что я передаю, имеет метод + scene, потому что он дает предупреждение во время компиляции, а класс передается во время выполнения. Я ищу решение для преодоления предупреждения; этот код работает отлично. Мне нужно сообщить компилятору, что я знаю, что я делаю, чтобы он мог перестать давать предупреждение. – Jaryl

-2

Если вы всегда будете пройти конкретный класс писание

-(void)startGameWithState:(ConcreteClass*)s 

Если вы будете использовать различные классы без какой-либо иерархии между ними использовать идентификатор, чтобы избежать предупреждения

-(void)startGameWithState:(id)s 

Второй метод не очень хорошо, потому что если вы передадите неправильный объект класса этому методу, вы получите ошибку времени выполнения. Но в составителя государстве все будет хорошо

Если вы знаете, что каждый класс прошел будут выведены из некоторого базового класса с методом +(id) scene затем передать базовый класс:

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

Я не передаю экземпляр класса. Я хочу передать сам класс. Это связано с тем, что метод + scene отвечает за создание экземпляра. – Jaryl

Смежные вопросы