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:、オブジェクトクラスにセレクターが作成されないように、コードの1つの場所から配列を並べ替えるときに使用する必要があります。

コード内の多くの場所からソートが呼び出されている場合は、セレクターを作成すると便利な場合があります。独自のオブジェクトではなく、特別な方法で並べ替えている場合でも、何らかのメソッドを使用しNSStringてカテゴリを作成し、それを使用できます。NSStringcustomCompare:

于 2012-08-01T05:13:41.510 に答える