遍历数组以不同方式处理索引 0

Iterate over array treating index 0 differently

我找到了很多关于遍历数组的问题和答案,但没有找到一个解释如何遍历数组的内容,以不同方式识别和处理索引 0 的问题和答案。

这样做的原因是我有一个传入的数据流,我想将它们显示为随时间变化的值图。一个简单的方法是创建一个 CGMutablePathRef,计算 x 和 y 坐标,然后 CGPathAddLineToPoint 继续画线。当然,路径必须从某处开始,因此对于第一个索引,我需要将 y 坐标设置为 0 偏移量,计算 x 坐标并使用 CGPathMoveToPoint.

设置路径的起点

我所做的是处理索引 0,然后复制数组并丢弃索引 0,并处理复制数组中的剩余项(除了 0 之外的所有项)。我也可以只设置一个布尔值 false,如果循环中的 false 将该点处理为索引 0,则将布尔值设置为 true。这两种方法都有点乱。

我真正不喜欢的部分是每次生成路径时都复制值数组。有没有一种简单的方法可以遍历从索引 1 开始的数组?

是否缺少一些方便的数组语法?

    var yOffset = 0.0
    temperaturePath = CGPathCreateMutable()
    CGPathMoveToPoint(temperaturePath, nil, xOffsetForTemperature(temperatures[0]), yOffset)
    var remainingTemperatures = temperatures
    remainingTemperatures.removeAtIndex(0)

    for value in remainingTemperatures {

        yOffset += verticalAdvanceAmount
        let temperatureXOffset = xOffsetForTemperature(value)
        CGPathAddLineToPoint(temperaturePath, nil, temperatureXOffset, yOffset)
    }

如果目标是将数组永久拆分为第一个元素和其他所有元素,请使用removeAtIndex,因为它returns已删除:

var temperatures = // ...
let first = temperatures.removeAtIndex(0) // alters temperatures

如果目标是导出第一个元素和其他所有元素而不改变原始数组,您可以取一个切片:

let first = temperatures.first!
let rest = temperatures[1..<temperatures.count]

但这是有捷径的特例;使用 dropFirst,原始数组保持不变:

let first = temperatures.first!
let rest = dropFirst(temperatures)

(请注意,我推导临时变量 firstrest 只是为了清楚起见。在现实生活中,您可以跳过它们。temperatures[1..<temperatures.count]dropFirst(temperatures) 都是for...in.)

可直接枚举

使用切片。

temperaturePath = CGPathCreateMutable()
CGPathMoveToPoint(temperaturePath, nil, xOffsetForTemperature(temperatures[0]), yOffset)

yOffset = 0.0
for value in temperatures.dropFirst() {
    yOffset += verticalAdvanceAmount
    let temperatureXOffset = xOffsetForTemperature(value)
    CGPathAddLineToPoint(temperaturePath, nil, temperatureXOffset, yOffset)
}

Swift Standard Library Reference and this article by Nate Cook 中有更多详细信息。

您可以选择将数据存储为 CGPoint 的数组,在这种情况下,您可以只使用 CGContextAddLines 进行初始移动并在一次调用中添加所有线段。

您可能会发现一旦拥有大量数据点,一遍又一遍地绘制整个路径效率低下,在这种情况下您可能会发现 this Q&A 很有帮助。