如何使用函数编程将字典转换为IndexPath数组?

时间:2018-01-09 10:12:27

标签: arrays swift dictionary

我有这种字典。

let sections = ["A": ["Item1", "Item2", "Item3", "Item4"], "B": ["Item1", "Item2", "Item3", "Item4"]]

我需要获取所有密钥并在创建IndexPath数组之前对它们进行排序。

let sectionsKeys = Array(sections.keys).sorted()

现在我需要将这个字典转换为IndexPath数组。

var indexPathes = [[0, 0], [0, 1], [0, 2], [0, 3], [1, 0], [1, 1], [1, 2], [1, 3]]

所以我的尝试非常简单。

for (sectionPos,key) in sectionsKeys.enumerated() {
    guard let items = sections[key] as? [String] else {
        break
    }
    for (itemPos,_) in items.enumerated() {
        let indexPath = IndexPath(row: itemPos, section: sectionPos)
        indexPathes.append(indexPath)
    } 

}

通过这种方式,我收到了预期的结果。

但我正在寻找能够使用功能编程来实现相同结果的解决方案。

1 个答案:

答案 0 :(得分:3)

首先,你应该对sections字典进行排序(产生一个元组数组),因为字典按定义是无序的,所以不能保证通过迭代字典本身你会得到理想的结果。

之后,您可以枚举有序集合,然后使用flatMapmap的组合来创建IndexPath。在迭代这些部分时,您需要flatMap来展平嵌套IndexPath返回的map数组。

您可以使用section.value.indices遍历索引本身而不是遍历枚举集合,而value的类型为[String]

let sections = ["Section 1": ["Item1", "Item2", "Item3", "Item4"], "Section 2": ["Item1", "Item2", "Item3", "Item4"]]

let indexPaths = sections.sorted(by: {$0.key < $1.key}).enumerated().flatMap({sectionPos, section->[IndexPath] in
    return section.value.indices.map({ itemPos->IndexPath in
        IndexPath(row: itemPos, section: sectionPos)
    })
})

输出:

  

[[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3] ]