gpt4 book ai didi

Swift 枚举顺序和比较

转载 作者:IT王子 更新时间:2023-10-29 05:13:47 25 4
gpt4 key购买 nike

我很难找到/理解有关如何在 Swift 中按定义顺序比较枚举的文档。特别是当我创建一个枚举时,例如

enum EnumType {
case First, Second, Third
}

Swift 不允许我直接按顺序比较枚举,例如

let type1 = EnumType.First
let type2 = EnumType.Second
if type1 < type2 {println("good")} // error

它生成编译错误“无法使用 {EnumType, EnumType} 类型的参数列表调用'<'。所以我找到的唯一解决方案是将我自己的比较运算符编写为重载,例如

enum EnumType : Int {
case First = 0, Second, 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"

对于在我的应用程序中有很多用途和值(value)的“重量级”枚举来说,这一切都很好,但是重载我可能想使用的所有运算符对于我可能定义的“轻量级”枚举来说似乎过于繁重为单个小模块的一些常量排序的苍蝇。

有没有办法在不为我在项目中定义的每个枚举类型编写大量样板重载代码的情况下做到这一点?更好的是,我是否缺少让 Swift 自动为没有关联类型的简单枚举提供比较运算符的东西,即。是无类型的还是类型为 Int 的? Swift 知道如何比较 Int,那么为什么它不能比较 enum Int?

最佳答案

只要你给你的枚举一个底层类型,它就会符合协议(protocol) RawRepresentable .

这意味着您可以为任何可原始表示的类型编写通用比较运算符,并且具有可比较的原始类型,如下所示:

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

这意味着您的枚举将自动拥有一个 <运算符(operator):

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

您仍然需要做的唯一一点样板是将您的枚举标记为 Comparable如果您想将它与需要的通用算法一起使用:

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]

使其符合Comparable也会给<= , > , 和 >=运算符自动(由标准库提供)。

关于Swift 枚举顺序和比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com