Swift 按案例名称对枚举进行排序

Swift Sorting an enum by its case names

我有一个枚举,我试图对其进行排序以给出顺序 A、B、C、D 等。原始值与此顺序不对应。所以从 Swift 4.2 开始,添加对 CaseIterable 的一致性意味着 BasePitches.AllCases 给我一个 [BasePitches] 数组,但如果我尝试 x = BasePitches.AllCases.sorted() 我得到错误:

实例成员 '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)
    }
}

您只需在 BasePitches.allCases 上调用 sorted(by:)。不需要符合Comparable,即

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

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

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

替换:

BasePitches.AllCases.sorted()

与:

BasePitches.allCases.sorted()

您的代码正确率为 99%。只是 AllCases 指的是集合的 type ,代表您的枚举的所有情况。您需要的是静态计算变量 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 }
}