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 that personArray
is an NSMutableArray
and use its sortUsingDescriptors:
method.
edit
Perhaps taking a look at the two methods will be more beneficial:
-[NSArray sortedArrayUsingDescriptors:];
-[NSMutableArray sortUsingDescriptors:];
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]
- ...and many others
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 new NSArray
), then personArray
must be an NSMutableArray
, and you must use the sortUsingDescriptors:
method.