我发现许多问题和答案涉及迭代数组,但没有找到解释如何迭代数组内容,识别和处理索引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)
}
答案 0 :(得分:2)
使用切片。
--t
Swift Standard Library Reference和this 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)
(请注意,我仅为了清晰起见而导出临时变量first
和rest
。在现实生活中,您可以跳过它们。temperatures[1..<temperatures.count]
和dropFirst(temperatures)
都可以直接枚举与for...in
。)