(快速)优雅的写作方式?

时间:2018-09-17 13:04:10

标签: swift sorting

假设我有这个结构:

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 :(得分:2)

您可以这样使用

tableTest.sorted(by: { $0.category.sortIndex < $1.category.sortIndex })

答案 1 :(得分:1)

只需执行以下操作:

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 {
    //  …
}