我正在使用sortedArrayUsingSelector对我拥有的数组进行排序。

这是我的称呼:

NSArray *sortedArray;
SEL sel = @selector(intSortWithNum1:withNum2:withContext:);
sortedArray = [_myObjs sortedArrayUsingSelector:sel];


这是定义:

- (NSInteger) intSortWithNum1:(id)num1 withNum2:(id)num2 withContext:(void *)context {
    CLLocationCoordinate2D c1 = CLLocationCoordinate2DMake([((myObj *)num1) getLat], [((myObj *)num1) getLong]);
    CLLocationCoordinate2D c2 = CLLocationCoordinate2DMake([((myObj *)num2) getLat], [((myObj *)num2) getLong]);

    NSUInteger v1 = [self distanceFromCurrentLocation:(c1)];
    NSUInteger v2 = [self distanceFromCurrentLocation:(c2)];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}


运行应用程序时,我的主线程出现thread1 SIGABRT错误。

有任何想法吗?提前致谢。

注意:我已经尝试过了:

NSArray *sortedArray = [[NSArray alloc] init];


它没有解决任何问题。

最佳答案

选择器应由要比较的对象实现,并且应仅接受一个参数,该参数是同一类型的另一个对象。

例如,在NSArray中,有一个示例,其中使用caseInsensitiveCompare比较字符串。这是因为NSString实现了caseInsensitiveCompare。

如果您想到了... sortedArrayUsingSelector如何知道在示例中将什么作为参数传递给函数?

编辑:
这意味着用作“排序选择器”的函数必须是由数组中的对象定义的函数。假设您的数组包含Persons,则您的数组必须按以下方式排序:

sortedArray = [_myObjs sortedArrayUsingSelector:@selector(comparePerson:)];


comparePerson消息将发送到数组中的对象(Persons),因此,在Person的类中,您必须具有一个称为comparePerson的函数:

- (NSComparisonResult)comparePerson:(Person *)person
{
    if (self.age == person.age)
        return NSOrderedSame;
}


在此示例中,comparePerson将自身(自身)与参数(人)进行比较,并且如果两个人的年龄相同,则认为两个人相等。如您所见,如果您编写了正确的逻辑,则这种比较和排序的方法将非常强大。

08-15 19:36