(Swift) Элегантный способ написания такого рода? - PullRequest
0 голосов
/ 17 сентября 2018

Допустим, у меня есть такая структура:

struct TestStruct {
    enum Category {
        case a
        case b
        case c
        var sortIndex: Int {
            switch self {
            case .a:
                return 1
            case .b:
                return 0
            case .c:
                return 2
            }
        }
    }
    var category: Category
    var name: String
}

Я хочу заказать коллекцию, содержащую их, по sortIndex их категории. Вот что я сделал:

let tableTest: [TestStruct] = [TestStruct(category: .b, name: "hello"),
                               TestStruct(category: .c, name: "hi"),
                               TestStruct(category: .a, name: "ok"),
                               TestStruct(category: .b, name: "bye")]

print(tableTest.sorted(by: { (first, second) -> Bool in
    first.category.sortIndex < second.category.sortIndex
}))

привет, пока, хорошо, привет

Это работает, но я хочу знать, есть ли более элегантный и быстрый способ написать это.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Просто сделайте что-то вроде этого:

extension TestStruct.Category: Comparable {
    static func < (lhs: TestStruct.Category, rhs: TestStruct.Category) -> Bool {
        return lhs.sortIndex < rhs.sortIndex
    }
}

extension TestStruct: Comparable {
    static func < (lhs: TestStruct, rhs: TestStruct) -> Bool {
        return lhs.category < rhs.category
    }
}

, а затем

print(tableTest.sorted())

NB : TestStruct может потребовать от вас определить метод (static func == (::) -> Bool) из Equatable, который вы можете написать самостоятельно, или автоматически реализовать его, добавив соответствие Equatable в объявлении структуры:

struct TestStruct: Equatable {
    //  …
}
0 голосов
/ 17 сентября 2018

Вы можете использовать как это

tableTest.sorted(by: { $0.category.sortIndex < $1.category.sortIndex })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...