Swift - 按可选值对数组排序

Swift - Sort array by optionals

因此,如果有一个 ToDos 数组,并且 Todo 对象具有属性 due(Bool),如果 ToDo 具有截止日期,则该属性具有信息; dueDate(Date) 这是一个可选的,所以如果 due 是 true dueDate != nil,如果 due 是 false dueDate = nil; creationDate(Date):Todo 创建的日期。此外,如果 ToDo 是否完成,还有一个 属性 isChecked(Bool) 给出答案。 现在我想按以下顺序对 ToDos 数组进行排序:

  1. isChecked = false,最接近的截止日期
  2. isChecked = false,dueDate = nil,最接近的创建日期
  3. isChecked true,最接近的创建日期

如何使用可选的 属性 截止日期来按照上述顺序对这个数组进行排序?

如果我理解正确的话,你的结构是这样的:

struct Item {
   let isChecked: Bool
   let creationDate: Date
   let dueDate: Date?
}

我认为“最接近”是指您希望项目按接近特定 Date 的程度排序。

这可以通过以下方式完成。我们先定义一个辅助方法:

extension Item {
   func getOrderingClosestTo(_ date: Date) -> (Int, Int, TimeInterval) {
      return (
         // items that are not checked are "smaller", they will be first
        isChecked ? 1 : 0,
        // items with dueDate are smaller, they will be first
        dueDate != nil ? 0 : 1,
        // items closer to "date" will be smaller
        abs((dueDate ?? creationDate).timeIntervalSince(date)) 
      ) 
   }
}

那么您可以拨打:

let myDate: Date = ...
let items: [Item] = ...

let sortedItems = items.sorted { [=12=].getOrderingClosestTo(myDate) < .getOrderingClosestTo(myDate) }