Если классы мало что делают, я бы просто поместил функции-члены в перечисление
enum State{
case state1
case state2
func getInfo() -> String
{
switch self
{
case .state1:
return "sometext1"
case .state2:
return "sometext2"
}
}
}
var currentState = State.state1
print(currentState)
print(currentState.getInfo())
Если вы действительно хотите, чтобы государства имели свой собственный класс, вы должны объявить, что они расширяют один и тот же суперкласс или реализуют тот же протокол, и использовать этот суперкласс / протокол в перечислении.
protocol StateProtocol
{
static func getInfo() -> String
}
class State1 : StateProtocol
{
static func getInfo() -> String {
return "sometext1"
}
}
class State2 : StateProtocol
{
static func getInfo() -> String {
return "sometext2"
}
}
enum State {
case state1
case state2
var instance: StateProtocol.Type {
switch self {
case .state1:
return State1.self
case .state2:
return State2.self
}
}
}
var currentState = State.state1.instance
print(currentState) //prints State1
print(currentState.getInfo())
Хотя мне не совсем удобно возвращать Type
класса только для того, чтобы использовать его статический метод.
Гораздо логичнее использовать класс State в качестве экземпляров, а не просто использовать его статический метод. (Почему вы называете экземпляр переменной, пока он не является экземпляром?)
class StateClass
{
func getInfo() -> String
{
return "default text"
}
}
class State1 : StateClass
{
override func getInfo() -> String
{
return "sometext1"
}
static let instance = State1()
}
class State2 : StateClass
{
override func getInfo() -> String
{
return "sometext2"
}
static let instance = State2()
}
enum State{
case state1
case state2
var instance : StateClass
{
switch self{
case .state1:
return State1.instance
case .state2:
return State2.instance
}
}
}
var currentState = State.state1.instance
print(currentState)
print(currentState.getInfo())