Swift Сортировка enum по именам падежей - PullRequest
0 голосов
/ 29 октября 2018

У меня есть перечисление, по которому я пытаюсь отсортировать, чтобы получить порядок A, B, C, D и т. Д. Необработанные значения не соответствуют этому порядку. Как и в Swift 4.2, добавление соответствия CaseIterable означает, что BasePitches.AllCases дает мне массив [BasePitches], но если я попытаюсь x = BasePitches.AllCases.sorted () Я получаю ошибку:

Элемент экземпляра 'sorted' нельзя использовать для типа '[BasePitches]'. Это верно, даже если я сделаю это сопоставимым и добавлю свою собственную сопоставимую функцию для сравнения строк с именами дел (вместо использования необработанных значений, которые дадут мне неправильный порядок). Кто-нибудь может помочь в этом, пожалуйста? Thx

    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 голосов
/ 29 октября 2018

Заменить:

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 }
}
0 голосов
/ 29 октября 2018

Вы можете просто позвонить 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]

Вы получите отсортированный порядок всех дел.

...