Swift 3 - 扩展Dictionary <String,Any>的数组

qua*_*yen 3 arrays dictionary extend swift3

我有这一系列的词典:

var dicts = [["key1": "value1", "key2": "value2"], ["key1": "value3", "key2": "value4"]]
Run Code Online (Sandbox Code Playgroud)

我应该如何扩展Array以便具有此功能:

dicts.values(of: "key1") // result: ["value1", "value3"]
Run Code Online (Sandbox Code Playgroud)

我试试这个:

extension Array where Iterator.Element == [String: Any] { // ERROR!

    func values(of key: String) -> [Any]? {
        var result: [Any]?
        for value in self {
            let val = value as! Dictionary<String, Any>
            for k in val.keys {
                if k == key {
                    if result == nil {
                        result = [Any]()
                    }
                    result?.append(val[k])
                    break
                }
            }
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

但我在extension Array声明时总是有错误标记:

错误:相同类型的要求使泛型参数'Element'非泛型

我该怎么做才能解决这个错误?

那么,是否可以重复Array使用for value in self

谢谢

JMI*_*JMI 6

extension Sequence where Iterator.Element == [String: Any] {

    func values(of key: String) -> [Any]? {
        var result: [Any] = []
        for value in self {
            let val = value 
            for (k, v) in val {
                if k == key {
                    result.append(v)
                    break
                }
            }
        }
        return result.isEmpty ? nil : result
    }
}

var dicts: [[String: Any]] = [["key1": "value1", "key2": "value2"], ["key1": "value3", "key2": "value4"]]
dicts.values(of: "key1")   // ["value1", "value3"]
Run Code Online (Sandbox Code Playgroud)

或更短的版本:

extension Sequence where Iterator.Element == [String: Any] {

    func values(of key: String) -> [Any]? {
        let result: [Any] = reduce([]) { (result, dict) -> [Any] in
            var result = result
            result.append(dict.filter{ $0.key == key }.map{ $0.value })
            return result
        }
        return result.isEmpty ? nil : result
    }
}

var dicts: [[String: Any]] = [["key1": "value1", "key2": "value2"], ["key1": "value3", "key2": "value4"]]
dicts.values(of: "key1")
Run Code Online (Sandbox Code Playgroud)

并且没有减少功能:

extension Sequence where Iterator.Element == [String: Any] {

    func values(of key: String) -> [Any]? {
        var result: [Any] = []
        forEach {
            result.append($0.filter{ $0.key == key }.map{ $0.value })
        }
        return result.isEmpty ? nil : result
    }
}

var dicts: [[String: Any]] = [["key1": "value1", "key2": "value2"], ["key1": "value3", "key2": "value4"]]
dicts.values(of: "key1")
Run Code Online (Sandbox Code Playgroud)