我想从这个字符串数组中获得
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 }} )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。