遍历数组以不同方式处理索引 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)
(请注意,我推导临时变量 first
和 rest
只是为了清楚起见。在现实生活中,您可以跳过它们。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 很有帮助。
我找到了很多关于遍历数组的问题和答案,但没有找到一个解释如何遍历数组的内容,以不同方式识别和处理索引 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)
(请注意,我推导临时变量 first
和 rest
只是为了清楚起见。在现实生活中,您可以跳过它们。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 很有帮助。