漫步IOS--指定比较器

对于基本数据类型的排序可以根据数据的值进行比较,但是如果是对于类进行排序比较呢?该按照哪一个属性的值进行比较排序呢?而很不巧的是,在进行排序的时候很多时候排序的并不是简单地基本数据类型。这个时候,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的会触发两个值的交换,其他的虽然看起来也是分类处理,但其实是啥也不做的,只能说可以有一个心里安慰吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值