【问题标题】:Can an enum contain another enum values in Swift?一个枚举可以在 Swift 中包含另一个枚举值吗?
【发布时间】:2017-04-01 14:55:04
【问题描述】:

我想分享一些枚举属性。比如:

enum State {
  case started
  case succeeded
  case failed
}

enum ActionState {
  include State // what could that be?
  case cancelled
}

class Action {
  var state: ActionState = .started

  func set(state: State) {
    self.state = state
  }

  func cancel() {
    self.state = .cancelled
  }
}

我明白为什么ActionState 不能从State 继承(因为cancelled 状态在State 中没有表示)但我仍然想说“ActionState 就像有更多选项的状态,并且ActionState 可以获取 State 类型的输入,因为它们也是 ActionState 类型”

我知道如何让上述逻辑与复制ActionState 中的案例并在set 函数中进行切换。但我正在寻找更好的方法。

我知道枚举不能在 Swift 中继承,并且我已经阅读了swift-enum-inheritance 的协议答案。它没有解决“继承”或包含来自另一个枚举的案例的需要,而只是属性和变量。

【问题讨论】:

  • Swift enum inheritance的可能重复
  • 阅读一下答案。对于缺乏直接方法,有一个不错的解决方法。
  • 不确定。解决方法使用协议使枚举从协议继承属性/函数,但我看不到如何使用它让枚举从另一个枚举继承案例(无论继承在这里)
  • 看起来最终答案是否定的。对我来说,这听起来很像是一个需要使用类而不是枚举的明显案例——当你真正需要继承时。
  • 我不需要继承和包含一样多,不管那可能是什么。继承实际上没有意义,因为假设这些是类,cancelled 状态在State 范围内将没有等效项。换句话说,ActionState 并不总是可以表示为State,而恰恰相反(但让StateActionState 继承真的很奇怪)我认为你的观点是,最终答案可能是否定的

标签: swift enums


【解决方案1】:

详情

  • 斯威夫特 4、3
  • Xcode 10.2.1 (10E1001)、Swift 5(本文最后修订版)

解决方案

enum State {
    case started, succeeded, failed
}

enum ActionState {
    case state(value: State), cancelled
}

class Action {
    var state: ActionState = .state(value: .started)
    func set(state: State) { self.state = .state(value: state) }
    func cancel() { state = .cancelled }
}

完整样本

不要忘记粘贴解决方案代码

import Foundation

extension Action: CustomStringConvertible {
    var description: String {
        var result = "Action - "
        switch state {
            case .state(let value): result += "State.\(value)"
            case .cancelled: result += "cancelled"
        }
        return result
    }
}

let obj = Action()
print(obj)
obj.set(state: .failed)
print(obj)
obj.set(state: .succeeded)
print(obj)
obj.cancel()
print(obj)

结果

//Action - State.started
//Action - State.failed
//Action - State.succeeded
//Action - cancelled

【讨论】:

    【解决方案2】:

    我必须验证用户许可文件。它有两个侧面 - 正面和背面。 根据验证文件可能有效或无效。 UX 也可以是活动状态或非活动状态,并显示相应的颜色。我最终制作了以下枚举。

    public enum Validity {
        case pending(_ selectState: SelectState)
        case valid(_ selectState: SelectState)
        case invalid(_ selectState: SelectState)
    
        enum SelectState {
          case active(_ side: Side)
          case inactive(_ side: Side)
    
          enum Side {
            case front
            case back
          }
        }
      }
    

    可以称为-

    public var validity: Validity = Validity.pending(.active(.front))

    我希望如果可以更干净,就像 - Validity.pending.active.front 但到目前为止,这是另一个枚举内部的枚举的解决方案。

    Swift 5.1, Xcode 11.4.1

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2010-12-22
      • 2019-01-29
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多