2012-02-11 53 views
12

我對objective-c仍然陌生,並且試圖弄清楚這個陳述究竟是做什麼的。sortedArrayUsingSelector它在做什麼?

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

我知道allKeys正在從我的字典中獲取所有密鑰。我知道sortedArrayUsingSelector正在排序我創建的數組。然後即時通訊調用比較方法,這就是我失去了什麼這是做什麼?從蘋果公司的文件中它說:「返回一個NSComparisonResult值,指示接收者是否大於,等於或小於給定的數字。」我不明白它是如何基於該方法進行排序的。

回答

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

上述代碼使用您提供的選擇器返回字典鍵的排序數組。選擇器實際上是將在您的數組中正在排序的對象上調用的函數。在這種情況下,您的數組包含字符串所以在實際NSArray的排序代碼會發生以下,

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

如果你在一個不同的選擇通過讓說@selector(randomFunction :)然後在分類代碼下面會發生

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

由於NSString沒有響應選擇器randomFunction,你會得到一個錯誤。如果你想創建你自己的比較函數類型,你需要爲數組包含的類添加一個類別(在你的情況下是NSString的一個類別)。

排序數組的更好方法是使用塊語句。

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 2012-02-11 20:00:53

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已經實施了一種方法,例如,如果您通過the NSString documentation閱讀,您會發現一個方法實施。如果您已在這些對象中實施比較方法,則還可以在自己的自定義對象上調用自定義比較方法。請注意,比較方法不必稱爲-compare:,重要的僅僅是返回值(NSComparisonResult)和方法接收的對象。

0

新數組包含對接收數組元素的引用,而不是對它們的拷貝。
比較器消息被髮送到數組中的每個對象,並且具有數組中的另一個對象作爲其單個參數。
例如,可以使用在NSString類中聲明的caseInsensitiveCompare:方法對NSString對象數組進行排序。假設存在一個數組,可以用這種方式創建數組的排序版本:

NSArray *sortedArray = 
    [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
相關問題