swift - 使用 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 进行排序的最佳选择是什么?我试过了map
,sort(by:)
但没有运气,我想了解这样做的最短方法。
解决方案
例如,如果当前位置是,
let currentLocation = CLLocation(latitude: CLLocationDegrees(-60), longitude: CLLocationDegrees(40.8))
然后你可以像这样使用排序cities
,currentLocation
distance(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)))]
推荐阅读
- docker - 无法使用文件配置 Docker 守护程序(配置文件
- c++ - 我可以在不创建自己的 Docker 映像的情况下在 Gitpod 中加载其他库吗?
- python - 如何连续发送通过 Request.Get.get 收到的列值?
- react-snap - React-Snap 与 Create-React-App 和 Service Worker
- sql-server - 在 MVC 中使用 nvarchar 主键的缺点
- select - SELECT 语句中的 Oracle 11g PLSQL 集合
- firebase - 如何为有状态小部件编写测试?
- php - 如何在不获取非法字符串偏移的情况下循环
- android - 无法下载 kotlin-reflect.jar (org.jetbrains.kotlin:kotlin-reflect:1.3.0):没有可用于离线模式的缓存版本
- r - 在处理的参数上定义默认的 R 函数参数