2015-01-07 3 views
2

У меня есть несколько классов, которые наследуются от SKNode. Оба имеют метод setup(). Они очень отличаются друг от друга.Смутно о протоколах

Я сделал протокол, как это:

protocol LevelProtocol { 
    func setup(level: Int) 
} 

и два из моих классов выглядеть примерно так: Фес

class Puzzle: SKNode, LevelProtocol { 
    func setup(level: Int) {do something} 

class Action: SKNode, LevelProtocol { 
    func setup(level: Int) {do something} 

И в моем главном классе мне нужно использовать один из этих классов в одной переменной. Как правильно определить эту переменную?

Я попытался это:

var lvl: LevelProtocol 
if myLevel > 5 { 
    lvl = Puzzle() 
else { 
    lvl = Action() 
} 

lvl.setup(myLevel) 
self.addChild(lvl) 

Но компилятор говорит, что LevelProtocol не конвертируется в SKNode Я знаю, что Я делаю что-то неправильно, просто не могу понять, что именно.

ответ

2

Я не очень хорошо в Swift, но я думаю, что вы могли бы попробовать self.addChild(lvl as SKNode)

Другое решение:

Ну, я думаю, вам нужно перепроектировать наследство. Попробуйте сделать класс Level наследующим от SKNode и объявить только один метод setup и оставить его тело пустым. Затем вы создаете классы Puzzle и Action, полученные от Level и имеющие собственную реализацию setup. Тогда ваш код:

var lvl: Level 
if myLevel > 5 { 
    lvl = Puzzle() 
} 
else { 
    lvl = Action() 
} 

lvl.setup(myLevel) 
self.addChild(lvl) 
+0

Не работает. Он работает, если я попробую 'self.addChild (lvl as Puzzle)', но это просто неправильно. – mres

+0

См. Мой отредактированный ответ –

+0

Да, это сработало, спасибо за понимание. Я, вероятно, оставлю этот вопрос открытым на пару дней, возможно, еще есть решение протокола. – mres

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