I need to generate a sorted array of NSNumber
s from another NSArray
. I want to use the sortedArrayUsingComparator:
method. I found this example in the Apple documentation:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Here I am just providing the comparator in a block, which is fine. The sort itself -- the bit that's hidden from me, which uses this block -- appears to be ascending.
I'd like to know if I can request a different sort order external to this block, or do I just need to flip the <
and >
's (or NSOrderedXXX
's) around?
If you want to sort descending, then just flip the comparisons (or flip the NSComparisonResult
s). There's no need to bloat the API by having an ascending:
parameter when you can control that in the block directly.
Just change the logic:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
return (NSComparisonResult)NSOrderedSame;
}];
For clarity it might be best to make this a method with a name similar to: decendingSort
.
From the documentation for -sortedArrayUsingComparator:
:
"Returns an array that lists the receiving array’s elements in ascending order, as determined by the comparison method specified by a given NSComparator Block."
So You'd have to resort to using
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
but of course that means rolling your own NSSortDescriptor objects first, which may suit your purposes just fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With