How should I fix this code?

2019-09-10 04:43发布

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条回答
劳资没心,怎么记你
2楼-- · 2019-09-10 05:21

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.

查看更多
登录 后发表回答