我无法找到/了解如何比较
Swift中的枚举的定义顺序的文档.特别是当我创建一个枚举,如
enum EnumType { case First,Second,Third }
Swift不允许我直接比较枚举,例如
let type1 = EnumType.First let type2 = EnumType.Second if type1 < type2 {println("good")} // error
它会生成编译错误“can not invoke”<'使用类型为{EnumType,EnumType}的参数列表,所以我发现唯一的解决方案是将自己的比较运算符写成重载,例如
enum EnumType : Int { case First = 0,Third } func <(a: EnumType,b: EnumType) -> Bool { return a.rawValue < b.rawValue } let type1 = EnumType.First let type2 = EnumType.Second if type1 < type2 {println("good")} // Returns "good"
这对于在我的应用程序中有很多使用和价值的“重量”枚举是好的,但是重载我可能想要使用的所有操作系统对于我可以在飞行中定义的“轻量级”枚举来说过于繁琐为单个小型模块提供一些常量的顺序.
有没有办法这样做,而不需要为我在项目中定义的每个枚举类型编写大量的样板重载代码?更好的是,有没有我想要的东西,使Swift自动为没有关联类型的简单枚举提供比较运算符,即.这是无类型或类型为Int? Swift知道如何比较Ints,为什么不能比较枚举Ints?
只要你给你的枚举一个基础类型,它将符合协议RawRepresentable.
原文链接:https://www.f2er.com/swift/318848.html这意味着您可以为任何可以代表的类型编写一个通用的比较运算符,并且具有可比较的原始类型,如下所示:
func <<T: RawRepresentable where T.RawValue: Comparable>(a: T,b: T) -> Bool { return a.rawValue < b.rawValue }
这将意味着您的枚举将自动地具有<操作符:
enum E: Int { // this would work with Double and String also // btw,no need to give a seed value of 0,// that happens automatically for Ints case A,B,C,D,E } E.A < E.C // returns true
您仍然需要做的唯一的样板标记将您的枚举标记为可比较,以防您希望使用需要使用的通用算法:
extension E: Comparable { } // (no need for anything else - requirements are already fulfilled) let a: [E] = [.C,.E,.A] let b = sorted(a) // b will now be [.A,.C,.E]
使其符合可比性也将自动(由标准库提供)< =>和> =运算符.