【问题标题】:Enums of typealiases in SwiftSwift 中的类型别名枚举
【发布时间】:2016-08-12 19:26:37
【问题描述】:

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

typealias State = String

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

我现在想要一个函数来处理States(例如,作为状态机的一部分等):

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 关系,所以这应该有效。我错过了什么?

【问题讨论】:

  • 您只需要添加 MyStates.Start.rawValue。到时候就好了。
  • 感谢您的回复!

标签: ios swift xcode macos enums


【解决方案1】:

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)

【讨论】:

  • 嗯。那么,MyStates 枚举的成员也不是隐含的States,因此也不是Strings?我对您建议的“通常方式”的问题是我计划将我的通用状态机代码重新用于其他州,而不仅仅是我碰巧在MyStates 枚举中设置的那些。感谢您的回复,顺便说一句!
  • 在进一步挖掘中,我最终陷入了一个兔子洞,这让我学习了带有关联类型的协议,在其中我发现 Swift 和 Objective-C 完全不同围绕“协议”这个词的语义,我的“is-a”本能在 Swift 领域是不正确的。我仍然没有满意的解决方案,但至少我基本明白为什么我尝试做的事情不起作用。
【解决方案2】:

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

但正如您的标题所说,对于“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

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多