2017-06-13 5 views
-2

座標が現在の位置から離れすぎている状態から、古い座標をすべてアレイから削除しようとしています。しかし、repeatステートメントは繰り返し実行されず、すべての座標が削除されます。私は私のrepeat文で立ち往生しています、そしてそれ以上の要素がないまでdistArray内のすべての要素が削除されるのでリピートステートメントで固まってしまう

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 

アプリが終了します。だから、それが再び繰り返され、空の配列から要素を削除しようとすると、致命的なエラーが発生します。

+1

インデントは非常に創造的です。 – Alexander

答えて

0

disArraySumを計算すると、繰り返しループ内で再計算されることはありません。 distArraySum> = maxDisの結果は決して変更されないため、ループは常に実行されるか実行されませんが、動的に状態が変更されることはありません。

また、locationArrayをタプルの配列に変更することもできます。あなたは緯度と経度をインタリーブしているように見え、それが簡単に概念的例えば次のようになります。

var locationArray:[(lat: Double, lon: Double)] = [] 

これはあなたが

locationArray.remove(at: locationArray.count-2) 
    locationArray.remove(at: locationArray.count-1) 

を行うことを回避しましょうとなり、我々はそれに取り組んでいる一方で、場合Iそれぞれの代わりに使用するように提案することができます。最後のループは、次のテストされていないコードのようになります。

for (i, coordinates) in locationArray.enumerate().reverse() { 
    if (some condition using coordinates.lat and coordinates.lon) { 
     locationArray.removeAtIndex(i) 
    } 
} 
関連する問題