【问题标题】:How to sort a dictionary in Swift by NSDate?如何通过 NSDate 在 Swift 中对字典进行排序?
【发布时间】:2015-07-06 15:29:05
【问题描述】:

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

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

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

【问题讨论】:

  • 您只能对NSArray 实例进行排序,在NSDictionary 中,键的顺序始终未确定。您的层次结构中有任何NSArray 可以排序吗?如果没有,请先创建一个,然后使用–sortedArray... 方法之一,或NSMutableArray 及其–sort... 方法之一。
  • @holex 好的,我将字典放在一个数组中。我将使用什么代码来对新数组进行排序?
  • 将您的日期转换为正确的NSDate 实例,并在排序方法的块内进行比较;甚至您可以为此使用谓词,但在您的情况下使用块进行比较看起来要简单得多。

标签: swift dictionary nsdate


【解决方案1】:

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

您还没有说,但假设您的字典是 [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 以拥有像这样的 &lt; 运算符:

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
}

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

【讨论】:

  • 可以通过在排序中使用 $0 和 $1 来缩短。不错的答案:)
  • @boidkan 我的经验法则是我只倾向于在单行闭包表达式中使用 $0、$1,或者当参数没有有意义的名称时(因此,我更喜欢 lhsrhs,因为这是二元谓词的约定)。
  • 对不起,这是 Swift 2 的语法,每个序列都有一个排序方法。对于 1.2,您需要使用免费功能,即 sort(d) { blah } 而不是 d.sort { blah }。但在这两种情况下,它都有效,因为字典是序列——一种支持每个元素迭代的类型(尽管在字典的情况下,以未定义的顺序)
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 2015-09-28
  • 2015-07-15
  • 2011-11-22
  • 1970-01-01
  • 2018-11-24
  • 2018-07-17
相关资源
最近更新 更多