在给定 indexPath 之后生成所有 indexPaths 的数组
Posted
技术标签:
【中文标题】在给定 indexPath 之后生成所有 indexPaths 的数组【英文标题】:Generate array of all indexPaths after given indexPath 【发布时间】:2017-07-12 11:21:21 【问题描述】:我正在写一个UICollectionViewLayout
子类。
我知道集合视图有多少个部分...numberOfSections
。
我知道每个部分有多少项目...numberOfItems[section]
。
给定一个起始 indexPath IndexPath(item: x, section: y)
我需要创建一个包含此起始 indexPath 之后的所有 indexPaths 的数组。
我尝试过类似...
// iterate all sections
let indexPaths: [IndexPath] = (initialIndexPath.section..<numberOfSections).flatMap section in
// find initial item in section
let initialItemIndex = section == initialIndexPath.section ? initialIndexPath.item + 1 : 0
// iterate all items in section
return (initialItemIndex..<(numberOfItems[section] ?? 0)).flatMap item in
return IndexPath(item: item, section: section)
但这告诉我(在第二个平面地图上)......
“flatMap”产生“[SegmentOfResult.Iterator.Element]”,而不是预期的上下文结果类型“IndexPath?”
我在布局的另一部分使用了类似的东西,但不太清楚为什么它在这里不起作用。
有更好的方法吗?
【问题讨论】:
【参考方案1】:好的,经过一番折腾后,我确定这取决于 Swift 推断闭包类型的方式。
我通过将第一个闭包的类型从 section in
显式设置为 (section) -> ([IndexPath])
来修复它
// iterate all sections
let indexPaths: [IndexPath] = (initialIndexPath.section..<numberOfSections).flatMap (section) -> ([IndexPath]) in
// find initial item in section
let initialItemIndex = section == initialIndexPath.section ? initialIndexPath.item + 1 : 0
// iterate all items in section
return (initialItemIndex..<(numberOfItems[section] ?? 0)).flatMap item in
return IndexPath(item: item, section: section)
【讨论】:
是的,有 2 个“flatMap”候选者,并且仅针对“单语句闭包”自动推断闭包类型。 – 请注意,内部 flatMap 可以只是一个地图。 – 为什么numberOfItems[section]
是可选的?
@MartinR 它现在只是可选的,因为我使用字典来存储它。我最终会改变它。 :)以上是关于在给定 indexPath 之后生成所有 indexPaths 的数组的主要内容,如果未能解决你的问题,请参考以下文章
当 UICollectionView 最初加载其数据时,我们如何获得可见的 Cell IndexPath
Swift:使用 sectionNameKeyPath 的单元格的 indexPath
给定 UITableViewCell 的 indexPath,加载该特定单元格