我有一个数组扩展名:
extension Array where Element == [String:Double] {
func values (keyOrder : [String]) -> [[Double]] {
return self.map { element in
return (0..<keyOrder.count).compactMap {element[keyOrder[$0]]}
}
}
}
它工作得很好,但是仅当Dictionary Key为String且Value为Double时才有效。我可以想象这个函数可以对任何类型的Dictionary完全相同地工作,例如[AnyHashable:Any],但是我不知道如何定义标头,这可能吗?
答案 0 :(得分:2)
在这种情况下可以使用的一个有用技巧是将where
子句从扩展声明移到方法声明。这使您可以为嵌套字典的Key
和Value
占位符类型引入新的通用占位符:
extension Array {
func nestedValues<Key, Value>(orderedBy keys: [Key]) -> [[Value]] where Element == [Key: Value] {
return map { element in
return keys.compactMap { element[$0] }
}
}
}
答案 1 :(得分:-1)
使用可以将字典 double 的值用作“任意类型”。您可以尝试以下代码。
extension Array where Element == [String: Any] {
func values (keyOrder : [String]) -> [[Any]] {
return self.map { element in
return (0..<keyOrder.count).compactMap {element[keyOrder[$0]]}
}
}
}