【问题标题】:Swift 2 - Sort Dictionary with NSDate()-KeysSwift 2 - 使用 NSDate()-Keys 对字典进行排序
【发布时间】:2015-11-24 00:17:02
【问题描述】:

我想对这种字典排序:

var data = [NSDate: [String: AnyObject]]()

例如

data: [2015-08-29 12:08:29 +0000: ["foo": "bar"]], 
      [2015-08-29 12:05:13 +0000: ["foo": "bar"]], 
      [2015-08-29 12:11:02 +0000: ["foo": "bar"]]

应该是:

dataSorted: [2015-08-29 12:05:13 +0000: ["foo": "bar"]], 
            [2015-08-29 12:08:29 +0000: ["foo": "bar"]], 
            [2015-08-29 12:11:02 +0000: ["foo": "bar"]]

我试过了:

let dataSorted = Array(data.keys).sorted(<)
// Could not find an overload for '<' that accepts the supplied arguments

let dataSorted = sorted(data) { $0.0 < $1.0 }
// Could not find member '0'

【问题讨论】:

    标签: arrays swift sorting dictionary swift2


    【解决方案1】:

    您无法对字典进行排序,因为它们没有顺序,因此我在答案中使用了数组。

    默认情况下NSDate 不符合Comparable 协议。你必须使用compare 方法:

    let results = Array(data).sort({ $0.0.compare($1.0) == .OrderedAscending })
    

    这个扩展可以用来使NSDate符合Comparable

    extension NSDate: Comparable {}
    public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
        return lhs.compare(rhs) == .OrderedSame
    }
    
    public func >(lhs: NSDate, rhs: NSDate) -> Bool {
        return lhs.compare(rhs) == .OrderedDescending
    }
    
    public func <(lhs: NSDate, rhs: NSDate) -> Bool {
        return lhs.compare(rhs) == NSComparisonResult.OrderedAscending
    }
    
    public func <=(lhs: NSDate, rhs: NSDate) -> Bool {
        return lhs < rhs || lhs == rhs
    }
    
    public func >=(lhs: NSDate, rhs: NSDate) -> Bool {
        return lhs > rhs || lhs == rhs
    }
    

    那么你可以简单地使用:

    let results = Array(data).sort({ $0.0 < $1.0})
    

    【讨论】:

    • results 的类型为 [(NSDate, [String: AnyObject])] instead of [NSDate, [String: AnyObject]]。我该如何纠正? let results = data.sort { $0.0 &lt; $1.0 } 也给了我[(NSDate, [String: AnyObject])] 的类型。
    • @PhilHarmonie 正如@Kirsteins 所说,字典无法排序(无序集合)。因此,您必须返回元组 (Key, Value) 的“有序集合”(Array)。
    • @Qbyte 是的,但是在对数组/字典进行排序后,它应该具有相同的类型。如果这是对其进行排序的唯一方法,我怎样才能将类型更改回其原始类型但包含已排序的内容?还是字典内容总是随机的?
    • @PhilHarmonie 字典在大多数情况下是“随机的”,因为元素的顺序依赖于 hashValue,但它不是由它排序的。所以这是完成它的最简单方法,但您也可以创建一个全新的数据结构,如 OrderedDictionary,它会自动处理排序。
    【解决方案2】:

    一个(至少对我来说)更容易阅读没有 $0 东西的解决方案是:

    let kartoffel = data.keys.sort { (date, date2) in   
            return date.compare(date2) == NSComparisonResult.OrderedAscending
        }
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @Adis 这确实提供了问题的答案——它不会从提问者那里寻求更多信息,也不是一个新问题。这是一个糟糕的纯代码答案,可能已经提供,但对于低质量审查队列不可删除。参考meta.stackoverflow.com/questions/287563/…
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2016-07-14
    • 2015-07-15
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多