2015-08-29 33 views
1

我想排序这种解释的:斯威夫特2 - 排序辞典的NSDate() - 键

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' 

回答

3

,因为他们没有命令不能排序的字典,所以我用数组在我的答案,而不是。

默认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}) 
+1

'results'的类型为[[(NSDate,[String:AnyObject])],而不是[NSDate,[String:AnyObject]]'。我该如何纠正? 'let results = data.sort {$ 0.0 <$ 1.0}'也给我类型[[(NSDate,[String:AnyObject])]'。 – PhilHarmonie

+1

@PhilHarmonie正如@Kirsteins所说,字典无法排序(无序集合)。因此你必须返回一个“有序集合”('Array')元组''(Key,Value)''。 – Qbyte

+0

@Qbyte是的没关系,但排序后的数组/字典它应该有相同的类型。如果这是对它进行排序的唯一方法,那么如何将该类型更改回原始类型,但使用排序后的内容?或者它的字典内容总是随机的? – PhilHarmonie

1

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

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

此答案已经提供 – Cristik

+0

这不会提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/12456503) – Adis

+0

@Adis这确实提供了一个问题的答案 - 它不会向提问者寻求更多信息,也不是一个新问题。这是一个糟糕的仅用于代码的答案,可能已经提供,但对于低质量审阅队列不可删除。请参阅http://meta.stackoverflow.com/questions/287563/youre-doing-it-wrong-a-plea-for-sanity-in-the-low-quality-posts-queue。 – Tunaki