gpt4 book ai didi

快速函数迭代可能反转的数组

转载 作者:可可西里 更新时间:2023-11-01 01:37:51 26 4
gpt4 key购买 nike

我想创建一个函数来遍历数组(或集合或序列)。然后,我将使用数组和数组的反转版本调用该函数(但效率很高:无需创建新数组来保存反转版本)。

如果我这样做:

func doIteration(points: [CGPoint]) {
for p in points {
doSomethingWithPoint(p)
}
// I also need random access to points
doSomethingElseWithPoint(points[points.count-2]) // ignore obvious index error
}

如果我有这个:

let points : [CGPoint] = whatever

我可以做到这一点:

doIteration(points)

但是如果我这样做:

doIteration(points.reverse())

我得到“无法将类型‘ReverseRandomAccessCollection<[CGPoint]> 的值转换为预期的参数类型 [_]”

现在,我不想这样做:

let reversedPoints : [CGPoint] = points.reverse()
doIteration(reversedPoints)

即使它会起作用,因为这会(如果我错了请纠正我)创建一个新数组,从 reverse() 返回的 ReverseRandomAccessCollection 初始化它。

所以我想我想编写我的 doIteration 函数来获取某种序列类型,这样我就可以直接传入 reverse() 的结果,但是 ReverseRandomAccessCollection 根本不符合任何条件。我想我遗漏了什么 - 这里可接受的模式是什么?

最佳答案

如果您将参数的类型更改为泛型,您应该获得所需的功能:

func doIteration
<C: CollectionType where C.Index: RandomAccessIndexType, C.Generator.Element == CGPoint>
(points: C) {
for p in points {
doSomethingWithPoint(p)
}
doSomethingElseWithPoint(points[points.endIndex - 2])
}

更重要的是,这不会导致创建数组的副本。如果您查看 reverse() 方法生成的类型:

let points: [CGPoint] = []

let reversed = points.reverse() // ReverseRandomAccessCollection<Array<__C.CGPoint>>

doIteration(reversed)

您会看到它只是创建了一个反向引用原始数组的结构。 (尽管它确实具有值类型语义)并且由于正确的泛型约束,原始函数可以接受这个新集合。

关于快速函数迭代可能反转的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34027044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com