我想从这个字符串数组中获得
let entries = ["x=5","y=7","z=10"]
到这个
let keyValuePairs = ["x" : "5","y" : "7","z" : "10"]
我试图使用地图,但问题似乎是一个字典中的键值对不是一个独特的类型,它只是在我的脑海里,但不是在字典类型,所以我不能真正提供一个转换函数,因为那里是没有变化的.加上地图返回一个数组,所以它是一个没有去.
有任何想法吗?
减号错误检查,看起来很像:
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]],然后使用reduce构建[String:Int]的字典.
或者,通过添加一个扩展到字典:
extension Dictionary { init(elements:[(Key,Value)]) { self.init() for (key,value) in elements { updateValue(value,forKey: key) } } }
(相当有用的扩展名btw,您可以使用它在字典上的很多地图/过滤器操作,真的是一个耻辱,默认情况下不存在)
变得更简单:
let dict = Dictionary(elements: entries .map({ $0.componentsSeparatedByString("=") }) .map({ ($0[0],Int($0[1])!)}) )
当然,你也可以组合两个地图电话,但我更喜欢分解个别的转换.
如果要添加一些错误检查,可以使用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 }}) )
再次,如果你想,你可以明显地将地图合并到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 }} )