swift – 有没有声明性的方式将Array转换为Dictionary?

前端之家收集整理的这篇文章主要介绍了swift – 有没有声明性的方式将Array转换为Dictionary?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从这个字符串数组中获得
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
    }}
)

猜你在找的Swift相关文章