You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:17:10