我在Swift中有一本字典,看起来有点像这样:
[
"1": [
"start": //An NSDate,
"end": //An NSDate,
"id": "1",
"other non relevant items": "below",
]
]
我希望在开始日期之前使用密钥"start"
对其进行排序。我已经看过关于按值here排序字典的文章,但我如何使用NSDates呢?你能举个例子吗?
答案 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
}
那就是说,我建议不要使用字典而不是最基本的操作,而是编写一个自定义结构并将数据存入其中,这样可以使这样的操作更简单。