迭代对数组处理索引0的方式不同

时间:2015-05-09 03:27:10

标签: swift core-graphics

我发现许多问题和答案涉及迭代数组,但没有找到解释如何迭代数组内容,识别和处理索引0的方法。

这样做的原因是我有一个传入的数据流,我想将它们显示为随时间变化的值的图表。一种简单的方法是制作CGMutablePathRef,计算x和y坐标,然后CGPathAddLineToPoint继续绘制线条。当然路径必须从某处开始,因此对于第一个索引,我需要将y坐标设置为0 offset,计算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)
    }

2 个答案:

答案 0 :(得分:2)

使用切片。

--t

Swift Standard Library Referencethis article by Nate Cook中的详细信息。

您可以选择将数据存储为temperaturePath = CGPathCreateMutable() CGPathMoveToPoint(temperaturePath, nil, xOffsetForTemperature(temperatures[0]), yOffset) yOffset = 0.0 for value in temperatures[1 ..< temperatures.count] { yOffset += verticalAdvanceAmount let temperatureXOffset = xOffsetForTemperature(value) CGPathAddLineToPoint(temperaturePath, nil, temperatureXOffset, yOffset) } 数组,在这种情况下,您只需使用CGContextAddLines进行初始移动,并在一次调用中添加所有线段。

一旦你有很多数据点,你可能会发现一遍又一遍地描述整个路径是不合理的,在这种情况下你可能会发现this Q&A有用。

答案 1 :(得分:1)

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

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。)