sortedArrayUsingSelector它在做什么?

时间:2012-02-11 18:00:06

标签: objective-c ios arrays

我仍然是Objective-c的新手,我正试图弄清楚这句话究竟在做什么。

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

我知道allKeys正在从我的字典中获取所有密钥。我知道sortedArrayUsingSelector正在对我创建的数组进行排序。然后我调用比较方法,这就是我迷失了这是做什么的?从apple上的文档中可以看出“返回一个NSComparisonResult值,指示接收者是否大于,等于或小于给定数量。”我不明白它是如何根据该方法进行排序的。

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

在这种情况下你可能应该使用caseInsensitiveCompare:,因为你很可能会排序一个字符串数组(字典中的键)。

您假设sortedArrayUsingSelector在某种程度上与代码的compare:部分分开。不是这种情况。 compare: 用于对数组进行排序的选择器。

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

NSArray如何实现这一点并非公开,但在根目录中,您定义的选择器用于比较数组中的对象对,其结果通知它们在排序数组中的位置。