我想分享一些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
继承(因为状态cancelled
在State
中没有表示),但我仍然希望能够说"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