Swift中的typealases枚举

时间:2016-08-12 19:26:37

标签: ios swift xcode macos enums

我明显遗漏了一些关于enums如何在Swift中工作的基本知识。请考虑以下情形:

typealias State = String

enum MyStates : State {
    case Start, Working, Done
}

我现在希望有一个与State s相关的函数(例如,作为状态机的一部分等):

func doSomething(s: State) {
    print("I got \(s)!")
}

在我看来,我应该能够这样称呼它:

doSomething(MyStates.Start)

但是,这会因以下错误而失败:Cannot convert value of type 'MyStates' to expected argument type 'State' (aka 'String')

我很困惑。在我看来,通过将MyStates声明为State类型,MyState实例应该与State具有 is-a 关系,并且所以这应该工作。我错过了什么?

2 个答案:

答案 0 :(得分:3)

MyState是枚举类型,State(又名String)枚举的原始类型。

您必须传递原始值

typealias State = String

enum MyStates : State {
  case Start, Working, Done
}

func doSomething(s: State) {
  print("I got \(s)!")
}

doSomething(MyStates.Start.rawValue)

或通常的方式

enum MyStates : String {
  case Start, Working, Done
}

func doSomething(s: MyStates) {
  print("I got \(s)!")
}

doSomething(MyStates.Start)

答案 1 :(得分:0)

我不确定我是否正确回答了您的问题

但是正如您的标题所说,对于“ Swift中的枚举枚举”,您可以执行以下操作:

enum States {
    typealias Start = Api.Objects.Tasks.States.Start
    typealias Working = Api.Objects.Tasks.States.Working
    typealias Done = Api.Objects.Tasks.States.Done
}

然后您可以引用特定的状态,例如States.Start而不是Api.Objects.Tasks.States.Start