可比较的枚举与Int

时间:2016-12-27 18:52:45

标签: swift enums

比较具有Int作为我添加的原始值的枚举:

func  <<T: RawRepresentable>(a: T, b: T) -> Bool where T.RawValue: Comparable {
    return a.rawValue < b.rawValue
}

现在我能做到:

enum Foo: Int {
    case a = 1
    case b = 2
}

let a = Foo.a
let b = Foo.b

print(a < b) // true

但是我应该如何制作它以便我可以比较枚举:

print(b < 1) // error

3 个答案:

答案 0 :(得分:2)

你只会做更多你已经做过的事情:

func <<T:RawRepresentable>(a:T, b:Int) -> Bool where T.RawValue == Int {
    return a.rawValue < b
}

答案 1 :(得分:2)

@matt's solution稍微更通用的版本 - 可让您将给定的RawRepresentable与其RawValue进行比较。虽然请注意,您必须同时为<和&amp; >以便允许所有4种可能的比较组合。

func < <T : RawRepresentable>(lhs: T, rhs: T.RawValue) -> Bool where T.RawValue : Comparable {
    return lhs.rawValue < rhs
} // allows b < 1

func < <T : RawRepresentable>(lhs: T.RawValue, rhs: T) -> Bool where T.RawValue : Comparable {
    return lhs < rhs.rawValue
} // allows 1 < b

func > <T : RawRepresentable>(lhs: T, rhs: T.RawValue) -> Bool where T.RawValue : Comparable {
    return lhs.rawValue > rhs
} // allows b > 1

func > <T : RawRepresentable>(lhs: T.RawValue, rhs: T) -> Bool where T.RawValue : Comparable {
    return lhs > rhs.rawValue
} // allows 1 > b

尽管如此,我会谨慎使用这种重载。能够说b < 1这样的事情并不是那么糟糕,但是当你允许你说b < c cInt时,水会变得更加模糊 - 它开始变得有点不清楚你实际比较的是什么(更不用说为重载决议增加了额外的复杂性)。

简单地说print(b.rawValue < 1)既清晰又简洁,是我写作的方式。

答案 2 :(得分:1)

RawRepresentable不是<,因此无法与<运营商一起使用。

以下是两个修复:

  1. 制作2个新的<<T: RawRepresentable>(a: T, b: Int)重载:

    • <<T: RawRepresentable>(a: Int, b: T)
    • Int
  2. RawRepresentable符合<,并重写现有的RawValue重载以使用两种泛型类型,如果它们具有相同的Comparable,则可以进行比较,这本身就是extension Int: RawRepresentable { public init?(rawValue: Int) { self.init(rawValue) } public var rawValue: Int { return self } } func < <T: RawRepresentable, U: RawRepresentable>(a: T, b: U) -> Bool where T.RawValue: Comparable, T.RawValue == U.RawValue { return a.rawValue < b.rawValue } enum Foo: Int { case a = 1 case b = 2 } print(Foo.a < Foo.b) print(Foo.b < 1)

    {{1}}