假设我有这个结构:
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
}))
你好,再见,好的,你好
它可以工作,但是我想知道是否有一种更优雅,更快捷的方式来编写它。
感谢您的帮助。
答案 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 {
// …
}