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