因此,我有一个从具有latitude
和longitude
属性的网络请求中获得的对象列表。我的目标是根据设备当前位置的接近程度对对象进行排序。我有一个有效的解决方案,但我觉得似乎有一个更优雅的实现。
这是我目前的功能:
func sortItems(items: [Item]) -> [Item] {
var distanceDictionary: [Int: Double] = [:]
guard let location = DefaultsWrapper.shared.lastLocation else {
return items
}
items.forEach { item in
let itemLocation = CLLocation(latitude: item.latitude, longitude: item.longitude)
let distance = item.distance(from: location)
distanceDictionary[item.id] = distance
}
var sortedItemIds: [Int] = []
for (k, _) in (Array(distanceDictionary).sorted {$0.1 < $1.1}) {
sortedItemIds.append(k)
}
var sortedItems: [Item] = []
sortedItemIds.forEach { id in
let itemIndex = items.firstIndex { item in
item.itemId == id
}
if let index = itemIndex {
sortedItems.append(items[index])
}
}
return sortedItems
}
有人能帮我简化这个代码或者提高它的效率吗?
func sortItems(items: [Item]) -> [Item] {
guard let location = DefaultsWrapper.shared.lastLocation else {
return items
}
return items.sorted(by:{$0.distance(from: location) < $1.distance(from: location) })
}