问题

我想做的事情看起来很简单,但我在网上找不到任何答案.我有一个 NSMutableArray 对象,假设它们是"Person"对象.我想通过Person.birthDate对 NSMutableArray 进行排序,它是一个 NSDate .

我认为它与这个方法有关:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

在Java中,我会让我的对象实现Comparable,或使用Collections.sort与一个内联的自定义比较器...你怎么在Objective-C中做这个?



解决方法

Compare method

您可以为物件实施比较方法:

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (better)

或通常更好:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

您可以通过向数组中添加多个键来轻松地对多个键进行排序.使用自定义比较器方法也是可能的.请查看文档< / a>.

Blocks (shiny!)

从Mac OS X 10.6和iOS 4开始,还可以使用块来排序:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

Performance

与使用 NSSortDescriptor 相比, -compare:和基于块的方法将会快一点,因为后者依赖于KVC. NSSortDescriptor 方法的主要优点是它提供了一种使用数据而不是代码来定义排序顺序的方法,这使得易于实现.设置事情,所以用户可以通过点击标题行排序 NSTableView .




相关问题推荐