与sortUsingSelector混淆

时间:2012-08-01 01:22:13

标签: objective-c sorting

当本书开始使用sortcompareNames:方法讨论数组中按字母顺序排列的元素时,我感到有些困惑。调用方法compareNames时,sort的参数是如何获得的?当所有返回的元素都是NSComparisonResult类型时,元素如何实际上按字母顺序排列?

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject
@property (copy, nonatomic) NSString *name, *email;

-(NSComparisonResult) compareNames: (id) element;

@end

@implementation AddressCard 
@synthesize name, email;

-(NSComparisonResult) compareNames:(id)element {
    return [name compare: [element name]];
}
@end

#import "AddressCard.h"
#import <Foundation/Foundation.h>

@interface AddressBook : NSObject
@property (nonatomic, copy) NSString *bookName;
@property (nonatomic, strong) NSMutableArray *book;

-(void) addCard: (AddressCard *) myCard;
-(void) sort;

@end

@implementation AddressBook
@synthesize book, bookName;

-(void) sort {
    [book sortUsingSelector: @selector(compareNames:)];
}

2 个答案:

答案 0 :(得分:1)

NSComparisonResult只是NSOrderedAscendingNSOrderedSameNSOrderedDescending中的一个。

方法compareNames负责真正的比较。在这种情况下,由于您要比较字符串,因此该方法仅依赖于compare已经实现的NSString方法。结果根据字母顺序提供有关两个字符串之间比较的信息。

sortUsingSelector的方法NSMutableArray是对自定义数据类型进行排序的有用方法(如果您尝试根据自定义条件对自定义对象进行排序,则可以更好地理解)。它接受一个选择器,这意味着每次需要比较两个对象时,都会调用选择器指定的方法。

我记得你不允许知道sortUsingSelector内部使用的方法(快速排序/堆排序/冒泡排序......),你需要知道的是该对象是使用指定的标准排序的通过使用选择器传递的方法的实现。

答案 1 :(得分:1)

排序方法(compareNames:)为需要比较的每对元素重复调用sortUsingSelector:方法;它提供了论据。确切地说,它对哪些元素对进行排序取决于排序算法。 Apple文档没有提到使用哪种方法,但QuickSort是一种相当常见的方法。如果你查看维基百科页面,你应该可以看到如何通过反复比较项目对,你可以最终得到排序的完整数组。