Использование ключа для назначения переменной экземпляра

Я был бы благодарен за любую помощь - ломал мне голову в течение многих дней, и я не могу понять, почему это не работает.

По сути, у меня есть контроллер основного вида, который будет управляться различными классами в зависимости от того, какую игру выбирает пользователь

"классический", "неограниченный", "рассчитанный по времени"

Когда пользовательская кнопка нажата, ей нужно пролистать опции и назначить экземпляр класса переменной "мозг".

вот что у меня есть:

var brain = GuessMeComparer()

func switcher (random:String) {

switch random {

case "Classic": self.brain = ClassicBrain()
case "unlimited": self.brain = GuessMeComparer()
case "timed": self.brain = TimedBrain()

default:break

}
}

Я получаю сообщение об ошибке "не могу присвоить значение типа" ClassicBrain "значению типа" GuessMeComparer ".

Все, что я могу думать, это то, что вы не можете назначать переменные экземпляра с помощью switch?

Любая помощь будет отличной, ура!

2 ответа

Решение

Использование AnyObject будет работать, но - как говорит Вадиан - заставит вас приводить к определенному типу позже. Лучшим вариантом будет абстрагирование общего интерфейса для всех классов мозга в быстром протоколе, например:

protocol BrainProtocol {
   // common interface here
   ...
}

class /* or struct */ ClassicBrain : BrainProtocol {
    // classic implementation here
    ...
}

class /* or struct */ TimedBrain : BrainProtocol {
    // timed implementation here
    ...
}

...

var brain : BrainProtocol

Swift - это сильный тип языка, переменная brain объявлен как тип GuessMeComparer,
После объявления вы не можете изменить тип.

Чтобы рассмотреть различные типы, объявите переменную явно как универсальный тип AnyObject,

 var brain : AnyObject = GuessMeComparer()

Теперь вы можете присвоить переменной разные типы, но во многих случаях вам придется приводить переменную к определенному типу позже в коде.

Другие вопросы по тегам