斯威夫特4
正如fl034提到的,这可以用斯威夫特4将错误选中的版本看起来像简化一些:
let foo = entries
.map { $0.components(separatedBy: "=") }
.reduce(into: [String:Int64]()) { dict, pair in
if pair.count == 2, let value = Int64(pair[1]) {
dict[pair[0]] = value
}
}
就更简单了,如果你不想要的值作为整数的:
let foo = entries
.map { $0.components(separatedBy: "=") }
.reduce(into: [String:String]()) { dict, pair in
if pair.count == 2 {
dict[pair[0]] = pair[1]
}
}
旧版TL; DR
减号错误检查,它厕所KS很像:
let foo = entries.map({ $0.componentsSeparatedByString("=") })
.reduce([String:Int]()) { acc, comps in
var ret = acc
ret[comps[0]] = Int(comps[1])
return ret
}
使用地图转[String]
陷入分裂了[[String]]
,然后构建的[String:Int]
字典从使用减少。
或者,通过添加扩展Dictionary
:
extension Dictionary {
init(elements:[(Key, Value)]) {
self.init()
for (key, value) in elements {
updateValue(value, forKey: key)
}
}
}
(相当有用的扩展顺便说一句,你可以用它来了很多字典映射/过滤操作,真有种耻辱它doesn”牛逼存在默认)
它变得更简单:
let dict = Dictionary(elements: entries
.map({ $0.componentsSeparatedByString("=") })
.map({ ($0[0], Int($0[1])!)})
)
当然,你也可以将二者结合起来的地图调用,但我更愿意分手的individu al转换。
如果你想添加一些错误检查,flatMap
可以用来代替的map
:
let dict2 = [String:Int](elements: entries
.map({ $0.componentsSeparatedByString("=") })
.flatMap({
if $0.count == 2, let value = Int($0[1]) {
return ($0[0], value)
} else {
return nil
}})
)
同样,如果你愿意,你可以明显地合并map
到flatMap
或将它们分割为简单起见。
let dict2 = [String:Int](elements: entries.flatMap {
let parts = $0.componentsSeparatedByString("=")
if parts.count == 2, let value = Int(parts[1]) {
return (parts[0], value)
} else {
return nil
}}
)
如果数组中的字符串总是采用相同的格式,那么可以解析键值“=”和值,并将所述数据分配给字典。 – Arc676
@ Arc676这是一种必要的方法,当然,我已经拥有了它......但我正在寻找一种声明性解决方案。 –