Objective-C: сортировка массива с использованием аргументов - PullRequest
2 голосов
/ 29 марта 2011

Я пытаюсь отсортировать массив, передавая аргумент селектору. Например, у меня есть массив местоположений, и я хочу отсортировать этот массив на основе расстояния, которое они имеют от определенной точки (например, моего текущего местоположения).

Это мой селектор, но я не знаю, как его назвать.

- (NSComparisonResult)compareByDistance:(POI*)otherPoint withLocation:(CLLocation*)userLocation {
    int distance = [location distanceFromLocation:userLocation];
    int otherDistance = [otherPoint.location distanceFromLocation:userLocation];

    if(distance > otherDistance){
        return NSOrderedAscending;
    } else if(distance < otherDistance){
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}

Я пытаюсь отсортировать массив с помощью следующей функции, но не могу передать свое местоположение селектору:

- (NSArray*)getPointsByDistance:(CLLocation*)location
{
    return [points sortedArrayUsingSelector:@selector(compareByDistance:withLocation:)];
}

Ответы [ 2 ]

9 голосов
/ 30 марта 2011

Помимо sortedArrayUsingFunction:context: (уже хорошо объяснено Владимиром), если вы ориентируетесь на iOS 4.0 и выше, вы можете использовать sortedArrayUsingComparator:, поскольку на переданное местоположение можно ссылаться из блока. Это будет выглядеть примерно так:

- (NSArray*)getPointsByDistance:(CLLocation*)location
{
    return [points sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        int distance = [a distanceFromLocation:location];
        int otherDistance = [b distanceFromLocation:location];

        if(distance > otherDistance){
            return NSOrderedAscending;
        } else if(distance < otherDistance){
            return NSOrderedDescending;
        } else {
            return NSOrderedSame;
        }
    }];
}

Вы можете, конечно, вызвать существующий метод изнутри блока, если пожелаете.

3 голосов
/ 29 марта 2011

Возможно, в вашем случае будет удобнее отсортировать массив с помощью метода sortedArrayUsingFunction:context:.Вы можете даже использовать сравнивающий селектор, который у вас уже есть:

NSComparisonResult myDistanceSort(POI* p1, POI* p2, void* context){
     return [p1 compareByDistance:p2 withLocation:(CLLocation*)context];
}
...
- (NSArray*)getPointsByDistance:(CLLocation*)location
{
    return [points sortedArrayUsingFunction:myDistanceSort context:location];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...