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

时间:2015-07-06 15:29:06

标签: swift dictionary nsdate

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

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

我希望在开始日期之前使用密钥"start"对其进行排序。我已经看过关于按值here排序字典的文章,但我如何使用NSDates呢?你能举个例子吗?

1 个答案:

答案 0 :(得分:3)

请注意,您不能对字典进行排序,除非您可以对任何序列进行排序,从而将其转换为键/值对的数组。

你还没有说,但假设你的字典是[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
}

那就是说,我建议不要使用字典而不是最基本的操作,而是编写一个自定义结构并将数据存入其中,这样可以使这样的操作更简单。