Как я могу удалить повторяющиеся координаты местоположения в массиве координат местоположения в swift, используя фильтр? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть массив координат местоположения, подобных этому

let coodinatesArray: [CLLocationCoordinate2D] = [
    CLLocationCoordinate2DMake(-37.986866915266461, 145.0646907496548),
    CLLocationCoordinate2DMake(-30.082868871929833, 132.65902204771416),
    CLLocationCoordinate2DMake(-21.493671405743246, 120.25335334577362),
    CLLocationCoordinate2DMake(-20.311181400000002, 118.58011809999996),
    CLLocationCoordinate2DMake(-20.311183981008153, 118.58011757850542),
    CLLocationCoordinate2DMake(-8.3154534852154622, 119.32445770062185),
    CLLocationCoordinate2DMake(4.0574731310941274, 120.06879782273836),
    CLLocationCoordinate2DMake(16.244430153007979, 120.68908125783528), 
    CLLocationCoordinate2DMake(27.722556142642798, 121.4334213799517),
    CLLocationCoordinate2DMake(37.513067999999976, 122.12041999999997)
]

Я нашел несколько ответов 1 , 2 , но я не могу использовать его, так как мой массив неEquatable.Можно ли удалить его, используя filter в swift для массивов?

1 Ответ

0 голосов
/ 25 мая 2018

Вы можете создать расширение для CLLocationCoordinate2D, чтобы оно соответствовало Hashable.

extension CLLocationCoordinate2D: Hashable {
    public var hashValue: Int {
        return Int(latitude * 1000)
    }

    static public func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool {
        // Due to the precision here you may wish to use alternate comparisons
        // The following compares to less than 1/100th of a second
        // return abs(rhs.latitude - lhs.latitude) < 0.000001 && abs(rhs.longitude - lhs.longitude) < 0.000001
        return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
    }
}

Затем вы можете получить уникальные местоположения, используя Set:

let coodinatesArray: [CLLocationCoordinate2D] = ... // your array
let uniqueLocations = Array(Set(coodinatesArray))

Если вам нужно сохранить первоначальный порядок, вы можете заменить эту последнюю строку на:

let uniqueLocations = NSOrderedSet(array: coodinatesArray).array as! [CLLocationCoordinate2D]
...