Skip navigation.
 
mlRe: Using NSSortDescriptor to reverse sort an NSArray containing NSString objects
FROM : George Stuart
DATE : Fri Jun 06 23:06:54 2008

On Jun 6, 2008, at 2:26 PM, Andrew Merenbach wrote:

> Quoting Ken Thomases <<email_removed>>:
>

>> On Jun 6, 2008, at 3:43 AM, George Stuart wrote:
>>

>>> NSSortDescriptor *desc = [[NSSortDescriptor alloc] 
>>> initWithKey:nil  ascending:NO 
>>> selector:@selector(localizedCompare:)];
>>> NSArray *sortedArray = [unsortedArray  sortedArrayUsingDescriptors:
>>> [NSArray arrayWithObject:desc]];
>>> [desc release];
>>>
>>> That seems to work just fine... but I'm worried.  I "guessed" at 
>>> using the key of "nil" since I want the actual objects in the 
>>> array  to be the target for the @selector.  Is it a fluke that 
>>> this works?  I don't want to rely on undefined behavior.

>>
>> Hmm.  Good question.  You could use @"description" as the key to
>> eliminate the uncertainty.  Or maybe @"self".
>>
>> Cheers,
>> Ken
>>

>
> Hi,
>
> This may not be an option in every case, but would making a 
> "wrapper" class for your strings work?  It'd just be a basic class 
> with an accessor/property and a corresponding ivar that would then 
> be the sort key.
>
> Cheers,
> Andrew



Thanks very much for the responses!  I'm leaning away from writing a 
wrapper as I'd rather try and leverage the base objects as much as 
possible.  Adding a wrapper will add complexity -- every place a 
string is inserted needs to be sure to first wrap the NSString in my 
custom wrapper.  It's a minor change, but would like to avoid this if 
possible.

The suggestion of using a keyPath of @"self" presents another question:
1)  I assume NSSortDescriptor is using valueForKeyPath:, which in 
turns calls valueForKey: some number of times, to get the object for 
the keyPath I specified.  Is it defined behavior that sending an 
object valueForKey:@"self" will return the object itself?  I guess 
this is ultimately the same as my original question, "is it defined 
behavior that sending an object valueForKey:nil will return the object 
itself?"

As for using a keyPath of @"description", I think this might be the 
best way for NSString.  I completely forgot about this option.  The 
docs say:

   Returns the receiver.

   - (NSString *)description

Duh... That's precisely what I need :).

Thanks,
George