Swift中一个enum可以包含另一个enum值吗?



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

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继承(因为状态cancelledState中没有表示),但我仍然希望能够说"ActionState就像具有更多选项的state,并且ActionState可以获得类型为state的输入,因为它们也是类型为ActionState"

我看到如何让上述逻辑与复制ActionState中的案例并在set函数中具有开关一起工作。但是我正在寻找一个更好的方法。

我知道enum在Swift中不能继承,并且我已经阅读了Swift -enum-inheritance的协议答案。它不需要"继承"或包含来自另一个enum的case,而只需要属性和变量。

详细信息

  • Swift 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

我必须验证用户许可证文档。它有两面,正面和背面。根据验证文档的不同,可能是有效的,也可能是无效的。此外,用户体验是这样的,它将是活动状态或非活动状态,并显示相应的颜色。我最后创建了以下enum。

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但这是目前为止解决Enum内部的另一个Enum可以是。

Swift 5.1, Xcode 11.4.1

最新更新