在给定indexPath

时间:2017-07-12 11:21:21

标签: swift uicollectionviewlayout nsindexpath flatmap

我正在写一个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;

我在布局的另一部分使用了与此类似的东西,但不太清楚为什么它在这里不起作用。

有更好的方法吗?

1 个答案:

答案 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)
    }
}