陷入重复陈述

时间:2017-06-13 23:46:02

标签: swift

我试图从坐标离我当前位置太远的条件中删除数组中的所有旧坐标。然而,重复语句在重复时被卡住,删除所有坐标。

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中的每个元素都被删除,直到没有更多元素为止。所以当它再次重复并尝试从空数组中删除一个元素时,我会收到一个致命的错误。

1 个答案:

答案 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)
   }
}