sortedArrayUsingSelector它在做什么?

我仍然是新的objective-c,并试图弄清楚这个陈述究竟做了什么。

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

我知道allKeys正在从我的字典中获得所有的密钥。 我知道sortedArrayUsingSelector正在sorting我创build的数组。 然后即时通讯调用比较方法,这就是我失去了什么这是做什么? 从苹果公司的文件中,它说:“返回一个NSComparisonResult值,指示接收者是否大于,等于或小于给定的数字。 我不明白它是如何基于该方法sorting。

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

上面的代码使用您提供的select器返回字典键的sorting数组。 select器实际上是将在您的数组中正在sorting的对象上调用的函数。 在这种情况下,你的数组包含string,所以在实际的NSArraysorting代码中会发生以下情况,

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

如果你通过一个不同的select器让@ selector(randomFunction :),那么在sorting代码中会发生以下情况

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

由于NSString不响应select器randomFunction,你会得到一个错误。 如果你想创build你自己的比较函数types,你需要添加一个类到数组包含的类(在你的情况下是一个类到NSString)。

sorting数组的更好方法是使用块语句。

 id mySort = ^(NSString * key1, NSString * key2){ return [key1 compare:key2]; }; NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort]; 

这是一个更好的方法是sorting任何对象是很容易做到的。

 id mySort = ^(MyObject * obj1, MyObject * obj2){ return [obj1.title compare:obj2.title]; }; NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort]; 
 - (NSComparisonResult)compare: { // if (value of firstObject) < (value of secondObject) // return NSOrderedAscending // else if (value of firstObject) == (value of secondObject) // return NSOrderedSame // else // return NSOrderedDescending } 

在你的例子中的-sortedArrayUsingSelector:方法调用数组中的对象的-compare:方法。 对于某些对象,Apple已经实现了一个-compare:方法,例如,如果您通读了NSString文档 ,您会发现实现了一个-compare:方法。 如果您已经在这些对象中实现了比较方法,则还可以在自己的自定义对象上调用自定义比较方法。 请注意比较方法不必被称为-compare:,重要的只是返回值(NSComparisonResult)和方法接收的对象。

您可能应该使用caseInsensitiveCompare:在这种情况下,因为您最有可能订购一个string数组(字典中的键)。

你已经假定sortedArrayUsingSelector在某种程度上是独立于compare:代码的一部分的。 不是这种情况。 compare: 用于sorting数组的select器。

sorting方法为您提供了一个数组,其中每个元素在发送指定的select器和数组中的下一个元素时,会给出正确的sorting顺序。

NSArray如何实现这个function不是公共的,但是在根目录下,你定义的select器用来比较数组内的对象,其结果通知它们在sorting数组中的位置。

新数组包含对接收数组元素的引用,而不是它们的副本。
比较器消息被发送到数组中的每个对象,并且具有数组中的另一个对象作为其单个参数。
例如,可以使用在NSString类中声明的caseInsensitiveCompare:方法对一个NSString对象数组进行sorting。 假设存在一个数组,可以用这种方式创build一个数组的sorting版本:

 NSArray *sortedArray = [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];