使用枚举在swift中存储当前状态类

使用枚举在swift中存储当前状态类,swift,Swift,我有两门课: class State1 { static func getInfo() -> String { return "sometext1" } } class State2 { static func getInfo() -> String { return "sometext2" } } 我还有一个州的枚举: enum State { case state1 case state2

我有两门课:

class State1 {
    static func getInfo() -> String {
        return "sometext1"
    }
}

class State2 {
    static func getInfo() -> String {
        return "sometext2"
    }
}
我还有一个州的枚举:

enum State {
    case state1
    case state2

    var instance: Any {
        switch self {
        case .state1:
            return State1.self
        case .state2:
            return State2.self
        }
    }
}
我试图将当前状态存储在变量中,并基于枚举调用类的方法:

var currentState = State.state1.instance
print(currentState) //prints State1

currentState.getInfo() //currentState is of type Any so not possible to call State1 methods

知道如何解决这个问题吗?

如果类做的不多,我会将成员函数放在枚举中

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())
虽然我不太习惯只使用静态方法返回类的类型

将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())

如果类做的不多,我只会将成员函数放在枚举中

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())
虽然我不太习惯只使用静态方法返回类的类型

将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())

为了回答您的核心问题,您可以使用带有关联值的枚举来更好地处理案例

关联值

您可以定义Swift枚举来存储任何 给定类型,并且值类型对于 枚举(如果需要)。与这些类似的枚举称为 其他编程中的歧视联合、标记联合或变体 语言

参考:

例子: 有关具有关联值的枚举的详细信息,请参见此处:

阅读子主题:关联值
为了回答您的核心问题,您可以使用带有关联值的枚举来更好地处理案例

关联值

您可以定义Swift枚举来存储任何 给定类型,并且值类型对于 枚举(如果需要)。与这些类似的枚举称为 其他编程中的歧视联合、标记联合或变体 语言

参考:

例子: 有关具有关联值的枚举的详细信息,请参见此处:

阅读子主题:关联值
如果你有类,使用超类不是更好吗?如果你有类,使用超类不是更好吗?