我正在尝试将下面的Swift 2扩展方法转换为Swift 3。
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转换工具给我留下了这样的印象。
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 {。我想不出怎么解决这个问题。
发布于 2016-12-15 09:12:51
有几个问题:
Generator被重命名为Iterator,因此AnyGenerator重命名为AnyIterator。IndexDistance是Collection的关联类型,它表示索引之间的步骤数。综合起来,您的方法在Swift 3中可以这样看:
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,以避免与
public func index(_ i: Self.Index, offsetBy n: Self.IndexDistance, limitedBy limit: Self.Index) -> Self.Index?Collection方法,用于索引的提升。
当然,您可以使用while循环而不是Iterator实现相同的结果。
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
}
}https://stackoverflow.com/questions/41159699
复制相似问题