2016-02-04 38 views
4

所以我有一個自定義對象的數組,它具有Double緯度和Double經度值。我想根據從特定點到陣列中每個項目的位置的計算距離對數組進行排序。我有一個函數可以根據緯度和經度值計算距離。有沒有簡單的方法來完成這種排序?在Swift中按計算距離對數組進行排序

回答

0

這很容易做到。 你的函數計算的距離必須接受一個類型是什麼陣列中要排序,並返回布爾,例如兩個參數:

// I assumed your array stores MyLocation 
func mySortFunc(location1: MyLocation, location2: MyLocation) -> Bool { 

    // do your calculation here and return true or false 
} 

var array: [MyLocation] = ... 
array.sortInPlace { (loc1, loc2) -> Bool in 
    mySortFunc(loc1, location2: loc1) 
} 
+0

嗯,爲什麼排序函數返回一個布爾?什麼是回報值由什麼決定的?這可能很明顯,但我有點困惑:) – ardevd

+0

讓我們假設你有一個Int [2,4,6]的數組,sort函數在第一次迭代中傳遞給函數2和4,如果2是如果不是4(假如沒有返回2 <4),則返回4,否則返回4和6,依此類推。如果數組的第一個元素的值較低,那麼函數應該返回true,第二個元素讓sort函數知道如何對它進行排序。 – Greg

13

假設你有一個模型Place爲對象:

class Place { 
    var latitude: CLLocationDegrees 
    var longitude: CLLocationDegrees 

    var location: CLLocation { 
     return CLLocation(latitude: self.latitude, longitude: self.longitude) 
    } 

    func distance(to location: CLLocation) -> CLLocationDistance { 
     return location.distance(from: self.location) 
    } 
} 

然後數組var places: [Place]可以被分類爲這樣的:

places.sort(by: { $0.distance(to: myLocation) < $1.distance(to: myLocation) }) 
+0

你不應該保證與物體的距離。那不是很好的編碼風格。只有在以後需要緩存時才需要它。更好地改變'distance = location.distanceFromLocation(fromLocation!)'到'返回距離= location.distanceFromLocation(fromLocation!)'和order by'places.sortInPlace({$ 0.calculateDistance(YOUR_LOCATION)<$ 1..calculateDistance(YOUR_LOCATION) })' – muescha

+1

@muescha感謝您的評論,更新的答案。 – xoudini

+0

:)我很高興幫助:) – muescha