Итак, у меня есть список объектов, которые я получаю из сетевого запроса со свойствами 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
}
У кого-нибудь есть способ упростить этот код или сделать его более эффективным?
Эй, спасибо за ответ, мне пришлось изменить его на это:
items.sorted(by:{CLLocation(latitude: $0.latitude, longitude: $0.longitude).distance(from: location) < CLLocation(latitude: $1.latitude, longitude: $1.longitude).distance(from: location) })
, но он работает отлично! Огромное спасибо!