首页 > 解决方案 > 使用 CLLocationCoordinate2D 按与当前位置的接近程度对结构字典进行排序

问题描述

我有一个定义以下参数的结构

struct City {
    let apiName: String
    let coordinates: CLLocationCoordinate2D
}

我创建了一个字典,我想按用户当前位置的接近度进行排序

let cities: [String: City] = [
    "Bilbao": City(apiName: "bilbao", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(43.263459), longitude: CLLocationDegrees(-2.937053))),
    "Madrid": City(apiName: "madrid", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(40.416775), longitude: CLLocationDegrees(-3.703790))),
    "New York": City(apiName: "new_york", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(40.730610), longitude: CLLocationDegrees(-73.935242)))]

在不使用 for 循环迭代并且不使用临时数组并对其进行排序的情况下对该 Dictionary 进行排序的最佳选择是什么?我试过了mapsort(by:)但没有运气,我想了解这样做的最短方法。

标签: swift

解决方案


例如,如果当前位置是,

let currentLocation = CLLocation(latitude: CLLocationDegrees(-60), longitude: CLLocationDegrees(40.8))

然后你可以像这样使用排序citiescurrentLocationdistance(from:)

let sortedCities = cities.sorted { (city1, city2) -> Bool in
    let diff1 = CLLocation(latitude: city1.value.coordinates.latitude, longitude: city1.value.coordinates.longitude).distance(from: currentLocation)
    let diff2 = CLLocation(latitude: city2.value.coordinates.latitude, longitude: city2.value.coordinates.longitude).distance(from: currentLocation)
    return diff1 < diff2
}

输出:

["Madrid": City(apiName: "madrid", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(40.416775), longitude: CLLocationDegrees(-3.703790))),
 "Bilbao": City(apiName: "bilbao", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(43.263459), longitude: CLLocationDegrees(-2.937053))),
 "New York": City(apiName: "new_york", coordinates: CLLocationCoordinate2D(latitude: CLLocationDegrees(40.730610), longitude: CLLocationDegrees(-73.935242)))]

推荐阅读