Swift怎么使用reduce方法创建一个Dictionary?

标签: Swift
发布时间: 2018/1/2 14:24:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试着在Swift里使用reduce方法从集合里创建一个Dictionary.我有一下变量:

var _squares  : [String] = []
var _unitlist : [[String]] = []
var _units    = [String: [[String]]]()

我想用下面的方法来填充_units字典:

  • 我要遍历_squares中的每个元素

  • 我想要查看_unitlist中的所有列表,只筛选包含该元素的列表

  • 构建一个包含每个元素作为键的字典和包含值的列表的列表。

举个例子。如果我们有:

squares = ["A"]
unitlist = [["A", "B", "C"], ["A", "C"], ["B", "C", "F"]]

我希望输出的应该是一个词典,"A"是Key,然后[["A", "B", "C"], ["A", "C"]]是Value.

我尝试了这样的方法:

_units = _squares.flatMap { s in
    _unitlist.flatMap { $0 }.filter {$0.contains(s)}
        .reduce([String: [[String]]]()){ (dict, list) in
            dict.updateValue(l, forKey: s)
            return dict
    }
}
举个例子。如果我们有:

我使用flatMap两次迭代,然后过滤,然后尝试使用reduce。

然而,它报错了Cannot assign value of type '[(key: String, value: [[String]])]' to type '[String : [[String]]]'

怎么解决?

解决方法 1:


let squares = ["A"]
let unitlist = [["A", "B", "C"], ["A", "C"], ["B", "C", "F"]]

let units = squares.reduce(into: [String: [[String]]]()) { result, key in
    result[key] = unitlist.filter { $0.contains(key) }
}


官方微信
官方QQ群
31647020