如何按 NSDate 对 Swift 中的字典进行排序?

How to sort a dictionary in Swift by NSDate?

我在 Swift 中有一本字典,看起来有点像这样:

[
  "1": [
    "start": //An NSDate,
    "end": //An NSDate,
    "id": "1",
    "other non relevant items": "below",
  ]
]

我想按开始日期排序,键为 "start"。我看过关于按值 here 对字典进行排序的文章,但是我如何使用 NSDates 来做到这一点?也可以举个例子吗?

请注意,您无法对字典进行排序,除非您可以对任何序列进行排序,这会将其转换为 key/value 对数组。

你没有说,但假设你的字典是 [String:[String:AnyObject]] 类型的,你可以像这样对它进行排序(以获得成对数组的结果,即 [(String,[String:AnyObject])]):

let sorted = d.sort { lhs,rhs in
    let l = lhs.1["start"] as? NSDate
    let r = rhs.1["start"] as? NSDate
    return l < r
}

这是假设您还增强了 NSDate 以拥有像这样的 < 运算符:

extension NSDate: Comparable { }

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.isEqualToDate(rhs)
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

根据字典的实际类型,这可能需要更多类型强制。

如果您不想要排序数组中的键(因为它只是 ID 的复制品),只需对值进行排序:

let sorted = d.values.sort { lhs, rhs in
    let l = lhs["start"] as? NSDate
    let r = rhs["start"] as? NSDate
    return l < r
}

也就是说,除了最基本的操作之外,我建议不要使用字典,而是编写自定义结构并将数据存储在其中,这将使此类操作更加简单。