try :
let dict = ["a":1, "c":3, "b":2]
extension Dictionary {
func sortedKeys(isOrderedBefore:(Key,Key) -> Bool) -> [Key] {
return Array(self.keys).sort(isOrderedBefore)
}
// Slower because of a lot of lookups, but probably takes less memory (this is equivalent to Pascals answer in an generic extension)
func sortedKeysByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] {
return sortedKeys {
isOrderedBefore(self[$0]!, self[$1]!)
}
}
// Faster because of no lookups, may take more memory because of duplicating contents
func keysSortedByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] {
return Array(self)
.sort() {
let (_, lv) = $0
let (_, rv) = $1
return isOrderedBefore(lv, rv)
}
.map {
let (k, _) = $0
return k
}
}
}
dict.keysSortedByValue(<)
dict.keysSortedByValue(>)
更新:
更新至beta 3中的新数组语法和排序语义.请注意,我使用sort
而不是sorted
来最小化数组复制.通过查看早期版本,将sort
替换为sorted
,并将KeyType[]
固定为[KeyType]
,代码可以变得更加紧凑
更新至Swift 2.2:
将类型从KeyType
更改为Key
,将ValueType
更改为Value
.使用新的sort
内置到Array
而不是sort(Array)
注使用sortInPlace
而不是sort
可以稍微改善所有这些性能