Сортировка списка объектов с помощью Swift в зависимости от их расстояния до местоположения устройства

avatar
jrend
1 июля 2021 в 16:34
42
1
0

Итак, у меня есть список объектов, которые я получаю из сетевого запроса со свойствами 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
}

У кого-нибудь есть способ упростить этот код или сделать его более эффективным?

Источник

Ответы (1)

avatar
SeaSpell
1 июля 2021 в 16:58
1
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) })
}
jrend
1 июля 2021 в 17:31
1

Эй, спасибо за ответ, мне пришлось изменить его на это: items.sorted(by:{CLLocation(latitude: $0.latitude, longitude: $0.longitude).distance(from: location) < CLLocation(latitude: $1.latitude, longitude: $1.longitude).distance(from: location) }), но он работает отлично! Огромное спасибо!