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

按CGFloat值升序排序对象数组并存储到字典的问题求助

解决OC自定义对象数组按CGFloat属性排序的问题

你的代码失效的核心原因很简单:CGFloat是Objective-C里的基本数据类型,不是NSNumber这类OC对象,所以你不能直接调用它的compare:方法——这个方法只有NSNumber等对象类型才会实现。

直接把你的排序代码改成下面这样就可以正常工作了:

// 不需要额外的for循环,直接对整个数组排序即可
NSArray *sortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    CGFloat first = [(PNPieChartDataItem*)a value];
    CGFloat second = [(PNPieChartDataItem*)b value];
    
    if (first < second) {
        return NSOrderedAscending; // 升序规则:first排在second前面
    } else if (first > second) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}];

额外补充:

  • 你原来写的for循环完全没必要,sortedArrayUsingComparator:会自动遍历整个数组完成排序,直接返回排序后的新数组。
  • 如果要把排序后的数组存入字典,直接将sortedArray作为对应key的value存入即可,示例:
    NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];
    resultDict[@"sortedPieChartItems"] = sortedArray;
    

另外,如果你想让代码更简洁,也可以把CGFloat包装成NSNumber再调用compare方法,不过上面的写法更直接高效:

return [[NSNumber numberWithFloat:first] compare:[NSNumber numberWithFloat:second]];

内容的提问来源于stack exchange,提问作者user7477041

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:13