字典作为Array的通用元素

时间:2018-11-19 09:46:21

标签: swift generics

我有一个数组扩展名:

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],但是我不知道如何定义标头,这可能吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下可以使用的一个有用技巧是将where子句从扩展声明移到方法声明。这使您可以为嵌套字典的KeyValue占位符类型引入新的通用占位符:

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]]}
        }
    }
}