最近我想根据indexPaths删除单元格,所以函数的输入参数是[IndexPath]类型,我需要根据indexPath.section将IndexPath拆分成几个数组,有什么简单的方法吗?例如
indexPaths =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)]要将此转换为
indexPath1 =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1)]
indexPath0 =
[IndexPath(row: 2, section: 0)]
// maybe get a [Array]
[indexPath0, indexPath1]发布于 2019-04-27 04:45:31
一种可能的解决方案是首先构建一个二叉树,其中键是节号,值是该节中的IndexPath数组。
let indexPaths = [
IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0),
]
let pathDict = Dictionary(grouping: indexPaths) { (path) in
return path.section
}然后,您可以将此字典映射到路径数组的数组中。但是,首先按照节对这些数组进行排序。
let sectionPaths = pathDict.sorted { (arg0, arg1) -> Bool in
return arg0.key < arg1.key // sort by section
}.map { $0.value } // get just the arrays of IndexPath
print(sectionPaths)输出:
[[0,2],[1,0,1,1,1,2]]
发布于 2019-04-27 04:57:41
var indexPaths = [IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)
]
extension Array where Element == IndexPath {
func splitArray() -> Array<[IndexPath]> {
var tempDict = [String : [IndexPath]]()
for element in self {
let section = element.section
if tempDict[String(section)] != nil {
// some element append
if var array = tempDict[String(section)] {
array.append(element)
tempDict[String(section)] = array
}
} else {
tempDict[String(section)] = [element]
}
}
// dictionary mayn't have sorted, sort the dictionary
tempDict.sorted{ $0.key > $1.key }
var returnedArray = Array<[IndexPath]>()
for (key, value) in tempDict {
returnedArray.append(value)
}
return returnedArray
}
}
print(indexPaths.splitArray())发布于 2019-04-27 05:42:13
使用过滤器:
let indexPath0 = indexPaths.filter { $0.section == 0 }
let indexPath1 = indexPaths.filter { $0.section == 1 }https://stackoverflow.com/questions/55877235
复制相似问题