我有一个自定义对象数组。此对象包含属性 endDate。
我需要能够以类似于下面的 sql 的方式对我的数组进行排序:
order by enddate = 0 desc, enddate desc
我知道如何做第二部分:
arr.sorted(by : {$0.enddate > $1.enddate})
但我不知道如何有条件地按结束日期排序
输入
[{x: "blah", enddate : 123456}, {x: "blah2", enddate : 234567}, {x: "blah3", enddate : 345678}, {x: "blah4", enddate : 0}]
所以我希望输出使结束日期降序,除非结束日期为 0 例如0, 345678, 234567, 123456
在实现这些类型的自定义排序顺序时,您应该牢记传递给 的排序谓词的语义要求sorted(by:)
。这些要求列在文档中:
谓词必须是对元素的严格弱排序。也就是说,对于任何元素 a、b 和 c,必须满足以下条件:
areInIncreasingOrder(a, a)
总是false
。(非自反性)- 如果
areInIncreasingOrder(a, b)
和areInIncreasingOrder(b, c)
都是true
,那么areInIncreasingOrder(a, c)
也是true
。(传递可比性)- 如果根据谓词,两个元素都不在另一个元素之前排序,则两个元素是不可比较的。如果a和b不可比,b和c不可比,那么a和c也不可比。(传递不可比性)
不遵守这些要求可能会导致排列不正确的数组。因此,考虑到这些要求,这里有一种表达排序顺序的方法:
struct S {
var endDate: Int
}
let arr = [S(endDate: 123456), S(endDate: 234567), S(endDate: 345678), S(endDate: 0)]
let result = arr.sorted {
switch ($0.endDate, $1.endDate) {
case (_, 0):
return false
case (0, _):
return true
case let (lhs, rhs):
return lhs > rhs
}
}
print(result)
// [S(endDate: 0), S(endDate: 345678), S(endDate: 234567), S(endDate: 123456)]
我们在这里使用的排序谓词是:
(0, 0)
是假的。任何其他(a, a)
wherea != 0
也是假的,因为>
也是非自反的。(0, a)
哪里a != 0
为真,哪里(a, 0)
为假。由 处理的任何其他组合>
,这是可传递的。0
,另一个元素必须0
是不可比较的。所以a == b == c == 0
,(a, c)
确实是不可比拟的。由 处理的任何其他组合>
,其传递性无与伦比。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句