首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“生成器”不是“Self.SubSequence”的成员类型

“生成器”不是“Self.SubSequence”的成员类型
EN

Stack Overflow用户
提问于 2016-12-15 08:37:21
回答 1查看 563关注 0票数 1

我正在尝试将下面的Swift 2扩展方法转换为Swift 3。

代码语言:javascript
复制
extension CollectionType {

    func chunk(withDistance distance: Index.Distance) -> [[SubSequence.Generator.Element]] {
        var index = startIndex
        let generator: AnyGenerator<Array<SubSequence.Generator.Element>> = anyGenerator {
            defer { index = index.advancedBy(distance, limit: self.endIndex) }
            return index != self.endIndex ? Array(self[index ..< index.advancedBy(distance, limit: self.endIndex)]) : nil
        }
        return Array(generator)
    }

}

Xcode转换工具给我留下了这样的印象。

代码语言:javascript
复制
extension Collection {

    func chunk(withDistance distance: Int) -> [[SubSequence.Iterator.Element]] {
        var index = startIndex
        let generator: AnyGenerator<Array<SubSequence.Generator.Element>> = anyGenerator {
            defer { index = index.advancedBy(distance, limit: self.endIndex) }
            return index != self.endIndex ? Array(self[index ..< index.advancedBy(distance, limit: self.endIndex)]) : nil
        }
        return Array(generator)
    }

}

现在,我在行中得到了上述错误,let generator: AnyGenerator<Array<SubSequence.Generator.Element>> = anyGenerator {。我想不出怎么解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-15 09:12:51

有几个问题:

  • 在Swift 3中,Generator被重命名为Iterator,因此AnyGenerator重命名为AnyIterator
  • IndexDistanceCollection的关联类型,它表示索引之间的步骤数。
  • 在Swift 3中,“集合移动他们的索引”,参见关于Swift进化的一种新的馆藏与指数模型

综合起来,您的方法在Swift 3中可以这样看:

代码语言:javascript
复制
extension Collection {

    func chunk(withDistance distance: IndexDistance) -> [[SubSequence.Iterator.Element]] {
        var pos = startIndex
        let iterator: AnyIterator<Array<SubSequence.Iterator.Element>> = AnyIterator {
            // Already at the end?
            if pos == self.endIndex { return nil }

            // Compute `pos + distance`, but not beyond `self.endIndex`:
            let endPos = self.index(pos, offsetBy: distance, limitedBy: self.endIndex) ?? self.endIndex

            // Return chunk and advance `pos`:
            defer { pos = endPos }
            return Array(self[pos..<endPos])
        }
        return Array(iterator)
    }
}

let a = [1, 2, 3, 4, 5, 6, 7]
let c = a.chunk(withDistance: 2)
print(c) // [[1, 2], [3, 4], [5, 6], [7]]

我已将本地index变量重命名为pos,以避免与

代码语言:javascript
复制
public func index(_ i: Self.Index, offsetBy n: Self.IndexDistance, limitedBy limit: Self.Index) -> Self.Index?

Collection方法,用于索引的提升。

当然,您可以使用while循环而不是Iterator实现相同的结果。

代码语言:javascript
复制
extension Collection {

    func chunk(withDistance distance: IndexDistance) -> [[SubSequence.Iterator.Element]] {
        var result: [[SubSequence.Iterator.Element]] = []
        var pos = startIndex
        while pos != endIndex {
            let endPos = self.index(pos, offsetBy: distance, limitedBy: self.endIndex) ?? self.endIndex
            result.append(Array(self[pos..<endPos]))
            pos = endPos
        }
        return result
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41159699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档