I'm trying to sort an array of people objects. The class looks like this.
Person
-------
name
phone
I have an NSMutableArray filled with these objects. I want to sort this array by the name of each person object.
This is the code I tried.
NSSortDescriptor *desc = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES];
[personArray sortedArrayUsingDescriptors: [NSMutableArray arrayWithObject: desc]];
It doesn't work. How can it be changed to work?
You're aware that
sortedArrayUsingDescriptors:
returns a new (sorted) array, correct? If you want to sort the array in-place, then you need to make sure thatpersonArray
is anNSMutableArray
and use itssortUsingDescriptors:
method.edit
Perhaps taking a look at the two methods will be more beneficial:
The first one starts with an adjective and a noun. The adjective describes the noun. The noun indicates that it is the return value. Since the noun is "array", it would make sense that the return value of the method is an
NSArray
. Since the adjective is "sorted", we can therefore assume that the returned array will be in some sort of order (the order being specified by the "using" the "descriptors").The second one starts with a verb. Since a verb is an action word, we can deduce that this is actually a behavioral method that will modify the receiver itself. Since the verb is "sort", we can therefore assume that the receiver will be in some sort of order after the method has completed.
Other "method pairs" that follow this pattern:
-[NSString stringByAppendingString:]
and-[NSMutableString appendString:]
-[NSArray filteredArrayUsingPredicate:]
and-[NSMutableArray filterUsingPredicate:]
-[NSCharacterSet invertedSet]
and-[NSMutableCharacterSet invert]
Since you're using the first method (
sortedArrayUsingDescriptors:
), you must retrieve the return value of the method; otherwise you're doing all this work for nothing. If you want to sort the array "in place" (ie, modify the receiver directly and not be given a newNSArray
), thenpersonArray
must be anNSMutableArray
, and you must use thesortUsingDescriptors:
method.