比较具有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
答案 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
c
是Int
时,水会变得更加模糊 - 它开始变得有点不清楚你实际比较的是什么(更不用说为重载决议增加了额外的复杂性)。
简单地说print(b.rawValue < 1)
既清晰又简洁,是我写作的方式。
答案 2 :(得分:1)
RawRepresentable
不是<
,因此无法与<
运营商一起使用。
以下是两个修复:
制作2个新的<<T: RawRepresentable>(a: T, b: Int)
重载:
<<T: RawRepresentable>(a: Int, b: T)
Int
让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}}