Objective-C自定义类实例数组排序求助:block排序未达预期
自定义类实例数组排序解决方案
别担心,这问题其实很好解决,核心就是把你熟悉的localizedStandardCompare:逻辑复用在自定义类的排序里就行!我给你一步步拆解:
一、直接用sortedArrayUsingComparator:的正确写法
假设你的自定义类叫CustomModel,用来获取排序字符串的方法是- (NSString *)targetSortString;(换成你实际的方法名就行),那正确的排序代码应该是这样:
// originalArray是你的自定义类实例数组 NSArray *sortedArray = [originalArray sortedArrayUsingComparator:^NSComparisonResult(CustomModel *objA, CustomModel *objB) { // 先获取两个实例的排序字符串,注意处理nil情况,避免排序异常 NSString *strA = [objA targetSortString] ?: @""; NSString *strB = [objB targetSortString] ?: @""; // 复用你之前用的localizedStandardCompare:,保证排序规则和字符串数组完全一致 return [strA localizedStandardCompare:strB]; }];
二、排查你之前没达到预期的常见原因
如果上面的写法还是有问题,大概率是踩了这几个坑:
- nil字符串未处理:如果某个实例的字符串方法返回
nil,会导致排序逻辑混乱,所以一定要用?: @""兜底成空字符串 - 比较顺序搞反:如果想倒序排序,要把
strA和strB的位置调换,写成[strB localizedStandardCompare:strA] - 方法调用错误:确认你调用的是正确的获取字符串的方法,比如是不是把
getDisplayName写成了getName?
三、更优雅的复用方式(可选)
如果这个自定义类经常需要排序,你可以让它实现compare:方法,这样以后排序就和字符串数组一样方便:
在自定义类的.m文件里添加:
- (NSComparisonResult)compare:(CustomModel *)otherModel { NSString *myStr = self.targetSortString ?: @""; NSString *otherStr = otherModel.targetSortString ?: @""; return [myStr localizedStandardCompare:otherStr]; }
之后排序直接用:
NSArray *sortedArray = [originalArray sortedArrayUsingSelector:@selector(compare:)];
这样是不是和你之前排字符串数组的用法几乎一样了?
内容的提问来源于stack exchange,提问作者salud
相关产品推荐
相关产品推荐

