使用枚举在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枚举来存储任何 给定类型,并且值类型对于 枚举(如果需要)。与这些类似的枚举称为 其他编程中的歧视联合、标记联合或变体 语言 参考: 例子: 有关具有关联值的枚举的详细信息,请参见此处: 阅读子主题:关联值
如果你有类,使用超类不是更好吗?如果你有类,使用超类不是更好吗?