2012-02-11 4 views
12

나는 여전히 objective-c에 새로운 것이고,이 문장이 정확히 무엇을하는지 알아 내려하고있다.sortedArrayUsingSelector 무엇을하고 있습니까?

[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

나는 allKeys이 내 사전에서 모든 키를 얻는 것을 알고 있습니다. 내가 sortedArrayUsingSelector 내 배열 메신저 정렬 정렬 알아요. 그럼 내가 비교 방법을 호출, 그게 내가 뭐하는거야 잃어버린거야? Apple의 문서에서 "수신자가 주어진 숫자보다 크거나 같거나 작은 지 여부를 나타내는 NSComparisonResult 값을 반환합니다."라는 메시지가 표시됩니다. 그 방법을 기반으로 정렬 방법을 이해하지 못합니다. 당신이 가장 가능성 (사전에서 키)를 문자열의 배열을 주문하고 있기 때문에

답변

22
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

위 코드는 사용자가 제공 한 선택기를 사용하여 사전 순 정렬 된 배열을 반환합니다. selector는 실제로 배열에서 정렬되는 객체에서 호출 될 함수입니다.

//... 
[key1 compare:key2]; 
//.. 

다른 선택에 전달 된 경우는 분류 코드에 다음을 다음 @selector (randomFunction을 :) 말할 수는 일이 될 다음 실제 NSArray를 분류 코드에서이 경우에 당신의 배열은 문자열이 포함 된 것 발생

//.. 
[key1 randomFunction:key2]; 
//.. 

NSString이 선택기 randomFunction에 응답하지 않으므로 오류가 발생합니다. 자신 만의 유형의 비교 함수를 만들려면 배열에 포함 된 클래스에 범주를 추가해야합니다 (NSString에 대한 범주).

배열을 정렬하는 더 좋은 방법은 block 문을 사용하는 것입니다.

id mySort = ^(NSString * key1, NSString * key2){ 
    return [key1 compare:key2]; 
}; 


NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort]; 

이유는 더 좋은 방법은 모든 개체를 정렬하는 것이 매우 쉽습니다.

id mySort = ^(MyObject * obj1, MyObject * obj2){ 
    return [obj1.title compare:obj2.title]; 
}; 


NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort]; 
+0

+1 - 좋은 설명 – bryanmac

5
- (NSComparisonResult)compare: 
{ 
    // if (value of firstObject) < (value of secondObject) 
     // return NSOrderedAscending 
    // else if (value of firstObject) == (value of secondObject) 
     // return NSOrderedSame 
    // else 
     // return NSOrderedDescending 
} 
0

당신은 아마이 상황에서 caseInsensitiveCompare:를 사용한다.

sortedArrayUsingSelector는 코드의 일부인 compare:과 별개라고 가정했습니다. 그렇지 않다. compare: 어레이를 정렬하는 데 사용되는 선택기입니다.

정렬 방법을 사용하면 각 요소가 지정된 선택기와 배열의 다음 요소로 전송 될 때 올바른 정렬 순서를 제공하는 배열을 다시 사용할 수 있습니다.

NSArray가이를 달성하는 방법은 공개가 아니지만 루트에서 정의하는 선택기는 배열 내에서 개체 쌍을 비교하는 데 사용되며 결과는 정렬 된 배열에 배치됩니다.

3

-sortedArrayUsingSelector : 배열의 객체에 방법 : 귀하의 예제에서 방법은 -compare를 호출합니다. Apple이 이미 -compare : 메소드를 구현 한 경우, 예를 들어 the NSString documentation을 읽은 경우 -compare : 메소드가 구현 된 것으로 나타납니다. 이러한 개체에 비교 메서드를 구현 한 경우 사용자 지정 개체에서 사용자 지정 비교 메서드를 호출 할 수도 있습니다. 비교 방법을 -compare :이라고 할 필요는 없으며 반환 값 (NSComparisonResult)과 메소드가받는 객체 만 중요하다는 점에 유의하십시오.

0

새 배열에는 수신 배열의 요소에 대한 참조가 들어 있으며 사본은 포함되어 있지 않습니다.
비교기 메시지는 배열의 각 개체에 보내지고 배열의 다른 개체가 단일 인수로 사용됩니다.
예를 들어, NSString 객체의 배열은 NSString 클래스에 선언 된 caseInsensitiveCompare : 메서드를 사용하여 정렬 할 수 있습니다. anArray가 있다고 가정하면 다음과 같이 정렬 된 버전의 배열을 만들 수 있습니다.

NSArray *sortedArray = 
    [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
관련 문제