迅捷3-扩展字典数组< String,Any> [英] Swift 3 - extend an Array of Dictionary<String, Any>
本文介绍了迅捷3-扩展字典数组< String,Any>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个字典数组:
var dicts = [["key1": "value1", "key2": "value2"], ["key1": "value3", "key2": "value4"]]
我应该如何扩展Array
以便具有此功能:
How should I extend Array
so that I have this function:
dicts.values(of: "key1") // result: ["value1", "value3"]
我尝试:
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
}
}
但是我总是在extension Array
声明中标记错误:
But I always have error marked at extension Array
declaration:
错误:相同类型的要求使通用参数元素"变为非通用
error: same-type requirement makes generic parameter 'Element' non-generic
我该怎么做才能解决此错误?
What should I do to fix this error?
用for value in self
迭代Array
是否正确?
谢谢
推荐答案
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"]
或更短的版本:
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")
并且没有减少功能:
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")
这篇关于迅捷3-扩展字典数组< String,Any>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文