2016-02-04 70 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