加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:35:56 所属栏目:百科 来源:网络整理
导读:我想从这个字符串数组中获得 let entries = ["x=5","y=7","z=10"] 到这个 let keyValuePairs = ["x" : "5","y" : "7","z" : "10"] 我试图使用地图,但问题似乎是一个字典中的键值对不是一个独特的类型,它只是在我的脑海里,但不是在字典类型,所以我不能真正提
我想从这个字符串数组中获得
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
    }}
)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读