views:

63

answers:

1

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?

+1  A: 

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.

Dave DeLong
Isn't that what I did? personArray is an NSMutableArray of person objects. I'm trying to sort by the name inside the person object.
awakeFromNib
@awakeFromnib: No that's not what you did. You called `sortedArrayUsingDescriptors:` instead of `sortArrayUsingDescriptors:` ... yours starts with "sorted", his suggestion starts with "sort".
imaginaryboy
to clarify imaginaryboy's comment: sortedArray... creates a new array, leaving the original unsorted. sortArray... sorts the source array.
codelark
I changed it to sortArray and got a warning message that NSMutableArray might not respond to that. Then when I ran the program it crashed.
awakeFromNib
@awakeFromNib edited answer for more info; also, apologies for typo-ing a method name.
Dave DeLong