斯威夫特 4
正如 fl034 所提到的,这可以通过 Swift 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
}
}
如果您不希望将值作为 Ints 则更简单:
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
减去错误检查,它看起来很像:
let foo = entries.map({ $0.componentsSeparatedByString("=") })
.reduce([String:Int]()) { acc, comps in
var ret = acc
ret[comps[0]] = Int(comps[1])
return ret
}
使用map将[String]拆分成[[String]],然后使用reduce构建[String:Int]的字典。
或者,通过向Dictionary 添加扩展名:
extension Dictionary {
init(elements:[(Key, Value)]) {
self.init()
for (key, value) in elements {
updateValue(value, forKey: key)
}
}
}
(顺便说一句,这是一个非常有用的扩展,您可以将它用于字典上的许多映射/过滤操作,真的很遗憾它默认不存在)
它变得更加简单:
let dict = Dictionary(elements: entries
.map({ $0.componentsSeparatedByString("=") })
.map({ ($0[0], Int($0[1])!)})
)
当然,您也可以将两个 map 调用结合起来,但我更喜欢将单独的变换分开。
如果要添加一些错误检查,可以使用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
}}
)