Objective-C:使用参数对数组进行排序

时间:2011-03-29 12:16:14

标签: iphone objective-c sorting

我正在尝试对一个将参数传递给选择器的数组进行排序。 例如,我有一个位置数组,我想根据它们与某个点的距离(例如,我当前的位置)对该数组进行排序。

这是我的选择器,但我不知道如何调用它。

- (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 个答案:

答案 0 :(得分:9)

除了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;
        }
    }];
}

当然,如果您愿意,可以在块内调用现有方法。

答案 1 :(得分:3)

在您的情况下,使用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];
}