Swift枚举顺序和比较

我无法找到/了解如何比较 Swift中的枚举的定义顺序的文档.特别是当我创建一个枚举,如
enum EnumType {
    case First,Second,Third
}
@H_502_3@Swift不允许我直接比较枚举,例如

let type1 = EnumType.First
let type2 = EnumType.Second
if type1 < type2 {println("good")} // error
@H_502_3@它会生成编译错误“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"
@H_502_3@这对于在我的应用程序中有很多使用和价值的“重量”枚举是好的,但是重载我可能想要使用的所有操作系统对于我可以在飞行中定义的“轻量级”枚举来说过于繁琐为单个小型模块提供一些常量的顺序.

@H_502_3@有没有办法这样做,而不需要为我在项目中定义的每个枚举类型编写大量的样板重载代码?更好的是,有没有我想要的东西,使Swift自动为没有关联类型的简单枚举提供比较运算符,即.这是无类型或类型为Int? Swift知道如何比较Ints,为什么不能比较枚举Ints?

只要你给你的枚举一个基础类型,它将符合协议RawRepresentable. @H_502_3@这意味着您可以为任何可以代表的类型编写一个通用的比较运算符,并且具有可比较的原始类型,如下所示:

func <<T: RawRepresentable where T.RawValue: Comparable>(a: T,b: T) -> Bool {
    return a.rawValue < b.rawValue
}
@H_502_3@这将意味着您的枚举将自动地具有<操作符:

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
@H_502_3@您仍然需要做的唯一的样板标记将您的枚举标记为可比较,以防您希望使用需要使用的通用算法:

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]
@H_502_3@使其符合可比性也将自动(由标准库提供)< =>和> =运算符.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...