Использование ключа для назначения переменной экземпляра
Я был бы благодарен за любую помощь - ломал мне голову в течение многих дней, и я не могу понять, почему это не работает.
По сути, у меня есть контроллер основного вида, который будет управляться различными классами в зависимости от того, какую игру выбирает пользователь
"классический", "неограниченный", "рассчитанный по времени"
Когда пользовательская кнопка нажата, ей нужно пролистать опции и назначить экземпляр класса переменной "мозг".
вот что у меня есть:
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()
Теперь вы можете присвоить переменной разные типы, но во многих случаях вам придется приводить переменную к определенному типу позже в коде.