通过带有条件的自定义属性和其次自定义属性 desc 订购 swift 数组

用户2363025

我有一个自定义对象数组。此对象包含属性 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章