2015-08-29 30 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