按CGFloat值对对象数组升序排序时返回行报错“Expected identifier”
问题分析与解决:排序Comparator中的"Expected identifier"错误
嘿,我来帮你排查这个错误!你遇到的问题出在return语句那一行,具体有两个关键问题:
语法错误:你写的
[first > second]完全不符合Objective-C的语法规则。方括号[]在OC里是用来给对象发送消息(也就是调用方法)的,但这里>是C语言的比较运算符,直接写first > second会得到一个BOOL值,你把它套在方括号里,编译器会误以为你要调用某个方法,自然会报错"Expected identifier"。返回值类型不匹配:
sortedArrayUsingComparator要求传入的block必须返回NSComparisonResult类型的枚举值(也就是NSOrderedAscending、NSOrderedSame、NSOrderedDescending这三个),而你试图返回一个布尔值(或者错误的表达式),类型完全不对。
修正后的代码
这里给你两种写法,你可以根据需求选择:
写法一:清晰的条件判断(推荐,可读性高)
- (void)setupPieChartWithItems:(NSArray *)items { NSArray *sortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { CGFloat first = [(PNPieChartDataItem*)a value]; CGFloat second = [(PNPieChartDataItem*)b value]; if (first > second) { // 降序:大的value排在前面 return NSOrderedDescending; } else if (first < second) { return NSOrderedAscending; } else { return NSOrderedSame; } }]; // 这里可以继续处理排序后的sortedArray }
写法二:简洁的三目运算符
如果喜欢更紧凑的代码,也可以这么写:
- (void)setupPieChartWithItems:(NSArray *)items { NSArray *sortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { CGFloat first = [(PNPieChartDataItem*)a value]; CGFloat second = [(PNPieChartDataItem*)b value]; return (first > second) ? NSOrderedDescending : ((first < second) ? NSOrderedAscending : NSOrderedSame); }]; }
小提示
如果你想要升序排列(小的value排在前面),只需要把NSOrderedDescending和NSOrderedAscending的位置互换就行啦!
内容的提问来源于stack exchange,提问作者user7477041
相关产品推荐
相关产品推荐

