2012-02-11 48 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:)]; 
相关问题