我试图从坐标离我当前位置太远的条件中删除数组中的所有旧坐标。然而,重复语句在重复时被卡住,删除所有坐标。
var locationArray = [Double]()
var distArray = [CLLocationDistance]()
let maxDis: CLLocationDistance = CLLocationDistance(exactly: 2000)!
let LAT = Double(location.coordinate.latitude)
let LONG = Double(location.coordinate.longitude)
repeat{
locationArray.insert(contentsOf: [LAT, LONG], at: 0)
} while locationArray.count <= 4
let oldCo = CLLocation(latitude: LAT, longitude: LONG)
let newlat = locationArray[2]
let newlong = locationArray[3]
let newCo = CLLocation(latitude: newlat, longitude: newlong)
let dist = newCo.distance(from: oldCo)
distArray.append(dist)
let distArraySum = (distArray.reduce(0) { $0 + $1 })
print(distArraySum)
repeat{
if distArraySum >= maxDis {
locationArray.remove(at: locationArray.count-2)
locationArray.remove(at: locationArray.count-1)
distArray.remove(at: 0)
print("deleted Coordinates")
}
} while distArraySum >= maxDis
应用程序终止,因为我遇到了我的重复语句,并且distArray
中的每个元素都被删除,直到没有更多元素为止。所以当它再次重复并尝试从空数组中删除一个元素时,我会收到一个致命的错误。
答案 0 :(得分:0)
计算disArraySum后,您永远不会在重复循环中重新计算它。 distArraySum&gt; = maxDis的结果将永远不会改变,因此你的循环将始终执行或永不执行,但它永远不会动态地改变状态。
此外,您可能需要考虑将locationArray更改为元组数组;它看起来像是在交织lat和lon,在概念上更容易,例如:
var locationArray:[(lat: Double, lon: Double)] = []
这样可以避免必须这样做
locationArray.remove(at: locationArray.count-2)
locationArray.remove(at: locationArray.count-1)
虽然我们正在使用它,如果我可以为每个使用建议,那么最终循环可能看起来像以下未经测试的代码:
for (i, coordinates) in locationArray.enumerate().reverse() {
if (some condition using coordinates.lat and coordinates.lon) {
locationArray.removeAtIndex(i)
}
}