我正在使用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将自身(自身)与参数(人)进行比较,并且如果两个人的年龄相同,则认为两个人相等。如您所见,如果您编写了正确的逻辑,则这种比较和排序的方法将非常强大。