我正在写一个UICollectionViewLayout
子类。
我知道集合视图有多少个部分...... numberOfSections
。
我知道每个部分有多少项目...... numberOfItems[section]
。
给定一个起始indexPath IndexPath(item: x, section: y)
我需要在这个起始indexPath之后创建一个包含所有indexPath的数组。
我尝试了类似......
// 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上)......
&#39; flatMap&#39;生成&#39; [SegmentOfResult.Iterator.Element]&#39;,而不是预期的上下文结果类型&#39; IndexPath?&#39;
我在布局的另一部分使用了与此类似的东西,但不太清楚为什么它在这里不起作用。
有更好的方法吗?
答案 0 :(得分:3)
好的,经过一段时间的麻烦,我确定它是由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)
}
}