对于基本数据类型的排序可以根据数据的值进行比较,但是如果是对于类进行排序比较呢?该按照哪一个属性的值进行比较排序呢?而很不巧的是,在进行排序的时候很多时候排序的并不是简单地基本数据类型。这个时候,OC和Java一样,提供了一个比较器的功能。
但是OC与Java在实现上有些不一样。
OC是数组可以调用一个方法进行排序,在这个方法中可以指定排序的规则,就是我们写好的compared方法,然后selector可以根据我们提供的方法名去数组元素里挨个调用对应的方法,如下面代码。
NSArray *arr = @[@"c",@"e",@"s",@"g",@"h"];
//@selector是一个方法选择器,作用是去数组中的每一个元素去找后面的方法进行调用
//第一:@selector 从给定的对象中调用方法,这个方法是我们给定的方法名
//第二:发生交换的条件是返回值为1.这是引发交换的唯一条件
NSArray *arr1 = [arr sortedArrayUsingSelector:@selector(compare:)];
上面的代码是调用代码,作用是去数组元素类型的类里找到compare:(注意冒号也是方法名的一部分)并且进行调用。上面的例子是String,如果数组里的是我们自己定义的Person类,就会去Person类里调用compare。当然,既然类是我们自己写的,调用也是我们自己写的,这个方法名字自然也是我们可以自由更改的。
然后剩下的就是我们去写比较器的实现了。.h文件定义,.m文件实现,下面的是实现代码。
- (NSComparisonResult) compareByAge:(Person *)aPerson{
if (_age > [aPerson age]) {
//引发交换的只有这种返回值
return NSOrderedDescending;
}else if (_age == [aPerson age]){
return NSOrderedSame;
}else {
return NSOrderedAscending;
}
}
NSOrderedDescending等都是常量,按住command点该常量可以进去看看他的值。这里值得一提的是,只有返回值为1的会触发两个值的交换,其他的虽然看起来也是分类处理,但其实是啥也不做的,只能说可以有一个心里安慰吧。