0

我收到一个奇怪的排序错误。我在一个名为 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;
    }
4

1 回答 1

1

当您使用sortedArrayUsingSelector:, 对数组进行排序时

[wordArrayDuplicates sortedArrayUsingSelector:@selector(sortedArrayUsingComparator:)];

您正在传递将在数组中的每个对象上调用的选择器。因此,您必须提供一些在数组中的对象中实现的方法。例如compare:, 的标准方法NSString

[wordArrayDuplicates sortedArrayUsingSelector:@selector(compare:)];

您正在传递另一种NSArray方法。您必须选择要使用选择器或比较器进行排序,但不能在另一个内部调用一个。


在您正确- (NSArray *)sortedArray使用的示例中sortedArrayUsingComparator:,请坚持这种方式。

使用建议

通常,在从代码的一个位置对数组进行排序时应该使用sortedArrayUsingComparator:,以避免在对象类中创建选择器。

当从代码中的许多地方调用排序时,创建选择器可能更有用。即使它不是您自己的对象并且您只是以某种特殊方式排序,您也可以使用某种方法NSString创建一个类别并使用它。NSStringcustomCompare:

于 2012-08-01T05:13:41.510 回答