我有这种字典。
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)
}
}
通过这种方式,我收到了预期的结果。
但我正在寻找能够使用功能编程来实现相同结果的解决方案。
答案 0 :(得分:3)
首先,你应该对sections
字典进行排序(产生一个元组数组),因为字典按定义是无序的,所以不能保证通过迭代字典本身你会得到理想的结果。
之后,您可以枚举有序集合,然后使用flatMap
和map
的组合来创建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] ]