
enum EnumType { case First,Second,Third} Swift不允许我直接比较枚举,例如
let type1 = EnumType.Firstlet type2 = EnumType.Secondif 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.Firstlet type2 = EnumType.Secondif type1 < type2 {println("good")} // Returns "good" 这对于在我的应用程序中有很多使用和价值的“重量”枚举是好的,但是重载我可能想要使用的所有 *** 作系统对于我可以在飞行中定义的“轻量级”枚举来说过于繁琐为单个小型模块提供一些常量的顺序.
有没有办法这样做,而不需要为我在项目中定义的每个枚举类型编写大量的样板重载代码?更好的是,有没有我想要的东西,使Swift自动为没有关联类型的简单枚举提供比较运算符,即.这是无类型或类型为Int? Swift知道如何比较Ints,为什么不能比较枚举Ints?
只要你给你的枚举一个基础类型,它将符合协议RawRepresentable.这意味着您可以为任何可以代表的类型编写一个通用的比较运算符,并且具有可比较的原始类型,如下所示:
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] 使其符合可比性也将自动(由标准库提供)< =>和> =运算符.
总结以上是内存溢出为你收集整理的Swift枚举顺序和比较全部内容,希望文章能够帮你解决Swift枚举顺序和比较所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)