我收到一个奇怪的排序错误。我在一个名为wordArrayDuplicates的数组中有一个范围列表。我需要根据范围位置对该数组进行排序,因此我将字符串转换为NSNumber,但不会进行比较。
*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__ NSCFString
sortedArrayUsingComparator:]:
- (NSArray *)sortedArray {
if (!sortedArray) {
sortedArray = [[NSArray alloc]init];
}
return [wordArrayDuplicates sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){
NSNumber * lastName1 = [NSNumber numberWithInt:NSRangeFromString(obj1).location];
NSNumber * lastName2 = [NSNumber numberWithInt:NSRangeFromString(obj2).location];
return [lastName1 compare:lastName2]; }];
}
-(void)beginGoingThroughDuplicatesAtWordIndex:{
if (index == 1) {[self loadDuplicates];}
[string addAttribute:(id)kCTForegroundColorAttributeName
value:(id)[UIColor blackColor].CGColor
range:NSMakeRange(0, string.length)];
BOOL shouldContinue = YES;
while (shouldContinue == YES && index<[[self sortedArray] count]) {
if (![[tv.text substringWithRange:NSRangeFromString([[self sortedArray] objectAtIndex:index-1])] isEqualToString:[tv.text substringWithRange:NSRangeFromString([[self sortedArray] objectAtIndex:index])]]) {
shouldContinue = NO;
}
[string addAttribute:(id)kCTForegroundColorAttributeName
value:(id)[UIColor redColor].CGColor
range:NSRangeFromString([sortedArray objectAtIndex:index-1])];
index++;
}
textlayer.string = string;
}
最佳答案
当使用sortedArrayUsingSelector:
对数组进行排序时,如下所示
[wordArrayDuplicates sortedArrayUsingSelector:@selector(sortedArrayUsingComparator:)];
您正在传递选择器,该选择器将在数组中的每个对象上调用。因此,您必须提供一些在数组对象中实现的方法。例如,
compare:
,这是NSString
的标准方法:[wordArrayDuplicates sortedArrayUsingSelector:@selector(compare:)];
您正在传递另一个
NSArray
方法。您必须选择使用选择器还是使用比较器进行排序,但不能在另一个内部调用。在
- (NSArray *)sortedArray
的示例中,您正确使用了sortedArrayUsingComparator:
,请遵循这种方式。使用建议
通常,从代码的一个位置对数组进行排序时应使用
sortedArrayUsingComparator:
,以避免在对象类中创建选择器。当在代码中的许多地方调用排序时,创建选择器可能会更有用。即使它不是您自己的对象,并且只是以某种特殊方式对
NSString
进行排序,您也可以使用NSString
方法在customCompare:
上创建类别并使用它。