【发布时间】:2016-03-24 09:39:09
【问题描述】:
我正在尝试扩展以字典为元素的数组,其中字典的值是可比较的。它基本上就像一个自定义对象数组并按特定属性值对它们进行排序,只是在这种情况下,它是字典,而不是类实例。
可以看到数据结构为Array<Dictionary<Key: Hashable, Value: Comparable>>,虽然前面的代码不受支持..
我认为它接近工作,但由于各种原因失败。
我的第一次尝试是
extension ArrayLiteralConvertible where Element == Dictionary<String, Comparable> {
func sortByKey<T: Comparable>(key: String, ascending: Bool) -> [[String: T]]? {
if let dictType = self as? [[String: T]] {
return ascending ? dictType.sort { return $0[key] < $1[key] } : dictType.sort { return $0[key] > $1[key] }
} else {
return nil
}
}
}
这在声明中有效,但在使用时会抛出错误
字典不能转换为 '[String: Int]'
另一个尝试:
extension SequenceType where Generator.Element == [String: AnyObject] {
func sortByKey<T: Comparable>(key: String, ascending: Bool) -> [[String: T]]? {
if let dictType = self as? [[String: T]] {
return ascending ? dictType.sort { return $0[key] < $1[key] } : dictType.sort { return $0[key] > $1[key] }
} else {
return nil
}
}
}
回馈
参数类型“[[String: _]]?”不符合预期的“任何”类型(又名“协议”)
我怎样才能做到这一点?
添加
我做了以下,但它被限制为特定类型,所以我必须为其他类型单独声明,如 String..
extension ArrayLiteralConvertible where Element == [String: Int] {
func sortByKey(key: String, ascending: Bool) -> [[String: Int]] {
let arraySelf = self as! [[String: Int]]
return ascending ? arraySelf.sort { return $0[key] < $1[key] } : arraySelf.sort { return $0[key] > $1[key] }
}
}
另一种选择:
func sortArray<T: Comparable>(array: [[String: T]], byKey key: String, ascending: Bool) -> [[String: T]] {
return ascending ? array.sort { return $0[key] < $1[key] } : array.sort { return $0[key] > $1[key] }
}
【问题讨论】:
标签: arrays swift generics dictionary extension-methods