2012-02-09 3 views
2

사전 배열이 있습니다. 각 사전은 내가 myRect.origin.x에 의한 배열을 정렬 할 방법이iPhone - CGRect의 원점 별 사전 배열 정렬. x

object, @"myObject", 
[NSValue valueWithCGRect:myRect], @"rect", 
nil 

처럼?

그 objective-c에는 사전 배열을 정렬하는 스마트 방법이 있습니다. 내 문제는 여기서 myRect의 x 좌표로 정렬하고 myRect는 NSValue로 감싼다는 것입니다 ... 어떤 방법 으로든 마법 명령으로 처리 할 수 ​​있습니까? 너희들이 마술사라는 걸 알아! : D

감사합니다.

답변

8

깨끗한 방법 (배열의 가변성에 따라) sortUsingComparator: 또는 sortedArrayUsingComparator 같은 방법을 사용하고의 구형을 언팩 맞춤 비교기 (블록은 두 개의 파라미터를 고려하고 NSComparisonResult 복귀)을 정의하고 그 X를 비교 아마도 - 좌표.

편집 : 음, 다른 사람들이 코드를 제공하기 때문에, 여기 내 꺼야 :

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    CGRect rect1 = [[obj1 valueForKey:@"rect"] CGRectValue]; 
    CGRect rect2 = [[obj2 valueForKey:@"rect"] CGRectValue]; 

    if(rect1.origin.x < rect2.origin.x) { 
     return NSOrderedAscending; 
    } else if(rect1.origin.x > rect2.origin.x) { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
}]; 
+1

YESSSSSSSSSSSSSS! 나는 너희들이 마술사라는 것을 알았다 !!!!! 감사! – SpaceDog

3

가 마법 없다, 그러나 그것은 하나, 무료 아니에요. :) 당신은 -[NSArray sortedArrayUsingComparator:]을 찾고 있습니다. 배열이 NSMutableArray이면 -[NSMutableArray sortUsingComparator:]을 사용할 수 있습니다.

비교자는 NSComparisonResult을 반환하고 두 개의 개체를 사용하는 블록입니다. 여기 NSObjCRuntime.h의 정의는 다음과 같습니다

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2); 

블록은, 개체을 사전에 캐스팅의 구형으로 각 후면에서 NSValues를 추출하고 X이 필드를 좌표 비교 한 결과를 반환해야합니다.

Psuedocode, 가정 NSMutableArray :

[myArray sortUsingComparator:^(id obj1, id obj2) { 
    NSDictionary *dict1 = (NSDictionary *)obj1; 
    NSDictionary *dict2 = (NSDictionary *)obj2; 
    // Extract each of the NSValues 
    // Compare the x values 
    if (xValue1 == xValue2) return NSOrderedSame; 
    return (xValue1 < xValue2) ? NSOrderedAscending : NSOrderedDescending; 
}]; 
+0

고마워요 !!!!!!!!!!!! – SpaceDog

1

이 그것을해야 (그것은이다 확실히 한 라이너 난 두려워) :

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id obj1, id obj2) { 
    ([[obj1 objectForKey:@"rect"] CGRectValue].x < [[obj2 objectForKey:@"rect"] CGRectValue].x)? NSOrderedAscending : NSOrderedDescending; 
}];