说......
怎么样......
var thingsBacking = [Thing](repeating: Thing(), count: 100) // hard limit!
var things: ArraySlice<Thing> = []
func fatCalculation() {
var pin: Int = 0
// happily, no need to clean-out thingsBacking
for c in .. some huge loop {
... only some of the items (roughly 20 say) become the result
x = .. one of the result items
thingsBacking[pin] = Thing(... x, y, z )
pin += 1
}
// and then, magic of slices ...
things = thingsBacking[0..<pin]
(然后,您可以在任何地方执行此操作...... for t in things { .. }
)
我想知道的是,有没有办法可以通过一个步骤拨打ArraySlice<Thing>
来执行此操作 - &#34;追加到&#34;一个ArraySlice并且避免在最后设置长度?
所以,像这样......
things = ... set it to zero length
things.quasiAppend(x)
things.quasiAppend(x2)
things.quasiAppend(x3)
如果没有进一步努力,things
现在的长度为3,实际上这三个项目已经在支持数组中。
我对这里的表现特别感兴趣(异常!)
另一种方法,
var thingsBacking = [Thing?](repeating: Thing(), count: 100) // hard limit!
然后将数据后面的第一个设置为nil作为结束标记。同样,你不必浪费时间归零。但结束标记是令人讨厌的。
有没有更好的方法来解决这种特殊类型的阵列性能问题?
答案 0 :(得分:1)
根据MartinR的评论,似乎问题出现了
似乎最好只是:
(1)设置数组
var ra = [Thing](repeating: Thing(), count: 100) // hard limit!
(2)在每次运行开始时,
.removeAll(keepingCapacity: true)
(3)继续前进.append
每个人。
(4)一旦完成,你不必特别标记结束或设定长度。
它似乎确实会使用相同的阵列支持。它当然会“增加长度”,就像每次你追加一样 - 你可以随时愉快地迭代。
切片 - 迷路了!