Swift 枚举不等式

2023-12-31

我已经习惯了能够治疗enums 作为数值,因此使用像这样的运算符>, <=对于大多数枚举用途来说,这可能不是必需的,但有一种情况是这样的:

@objc public enum MyState: Int {
    case Loading = 0
    case Loaded
    case Resolved
    case Processed
}

我希望能够获取一个实例变量并检查这一点:

var state: MyState = ...
if state > .Loaded {
    ...
}

但 Swift 抱怨它不知道该怎么办。我已将枚举声明为 Int。是我比较的唯一选择rawValue是?我希望避免这种情况,因为它真的很难看,而 Swift 得到了sooo自行关闭。


难道这些还不够吗?

enum State: Int, Comparable {
    case Loading
    case Loaded
    case Resolved
    case Processed
}

func < (lhs: State, rhs: State) -> Bool {
    return lhs.rawValue < rhs.rawValue
}

let state = State.Resolved
state > .Loaded // true

请注意,仅<需要实施,因为enums 已经相等了...

一般来说,可比性enums独立于它们的原始值(如果有)——例如:

enum State: Comparable {
    case Good
    case Bad
}

func < (lhs: State, rhs: State) -> Bool {
    return lhs == .Bad && rhs == .Good
}

let state = State.Good
state > .Bad // true

关于第二个想法, Swift 确实允许我们扩展RawRepresentable具有 @devios 正在寻找的确切效果的协议:

/// Extends all `RawRepresentable` enums with `Comparable` raw values, 
/// such as `enum E : Int` or `enum E : String`...
///
public func < <E: RawRepresentable where E.RawValue : Comparable> (lhs: E, rhs: E) -> Bool {
    return lhs.rawValue < rhs.rawValue
}

将其隐藏在扩展库中的某个位置后,您所需要做的就是通过将您的类型声明为来明确选择加入Comparable:

enum N: Int, Comparable {
    case Zero, One, Two, Three
}

enum S: String, Comparable {
    case A, B, C, D
}

let n: N = .Two
n > .One // true

let ss: [S] = [.B, .A, .D, .C].sort() // [A, B, C, D]

如果通用行为不适合特定类型,这仍然允许您提供具体的实现:

func < (lhs: S, rhs: S) -> Bool {
    return rhs.hashValue < lhs.hashValue // inverting the ordering
}

let ss: [S] = [.B, .A, .D, .C].sort() // [D, C, B, A]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 枚举不等式 的相关文章

随机推荐