Swift通过枚举名称对枚举进行排序

时间:2018-10-29 07:21:54

标签: swift enums swift4.2

我有一个枚举,尝试对它进行排序以赋予顺序A,B,C,D等。原始值与此顺序不符。因此,从Swift 4.2开始,向CaseIterable添加符合性意味着BasePitches.AllCases给了我一个[BasePitches]数组,但是如果我尝试 x = BasePitches.AllCases.sorted()我收到错误:

实例成员“已排序”不能用于类型“ [BasePitches]”。即使我使它具有可比性并添加我自己的可比函数来比较案例名称的字符串,也是如此(而不是使用会给我错误顺序的原始值)。有人能帮忙吗?谢谢

    enum BasePitches: Int, CaseIterable, Comparable {
        case C = 0
        case D = 2
        case E = 4
        case F = 5
        case G = 7
        case A = 9
        case B = 11
        // Implement Comparable
        public static func < (lhs: BasePitches, rhs: BasePitches) -> Bool {
            return String(describing: lhs) < String(describing: rhs)
    }
}

2 个答案:

答案 0 :(得分:1)

替换:

BasePitches.AllCases.sorted()

具有:

BasePitches.allCases.sorted()

您的代码正确率为99%。只是AllCases是指表示您的枚举的所有情况的集合的类型。您需要的是静态计算变量allCases(小写的a)。


public protocol CaseIterable {

    /// A type that can represent a collection of all values of this type.
    associatedtype AllCases : Collection where Self.AllCases.Element == Self

    /// A collection of all values of this type.
    public static var allCases: Self.AllCases { get }
}

答案 1 :(得分:0)

您只需在sorted(by:)上致电BasePitches.allCases。无需遵循Comparable,即

let cases = BasePitches.allCases  //[C, D, E, F, G, A, B]

let sortedCases = BasePitches.allCases.sorted {
    return String(describing: $0) < String(describing: $1)
}   //[A, B, C, D, E, F, G]

您将获得所有案件的排序顺序。