对Objective-C数组进行排序:'element'来自哪里?

时间:2013-11-01 13:17:08

标签: objective-c

我正在读一本关于Objective-C的书。处理地址簿中排序数组的部分。排序方法是这样的:

- (void) sort
{
[book sortUsingSelector: @selector(compareNames:);
}

'compareNames'方法是这样的:

//Compare the two names from the specified address cards
-(NSComparisonResult) compareNames: (id) element
{
return [name compare: [element name]];
}

我能看出它是如何运作的。通过将数组的每个元素与下一个元素进行比较,直到按字母顺序交换所有“名称”。

我没有得到(因为之前没有提到过)是“(id)元素”论点的来源?我得到的“名字”原因已在之前初步确定。但'元素'从何而来?这是NSArray附带的固定对象吗?前面描述了如何通过例如打印元素。 NSLogging nummer [1]。如果是这本地址簿,那本书中的一个元素或卡片可以由NSLogging书籍[32]打印出来。但是'元素'如何适合呢?

2 个答案:

答案 0 :(得分:2)

  

我得到的'名字'因为早先已经初始化了。

我不确定你是否明白这是如何运作的。与排序选择器相对应的方法必须比较作为数组成员的两个对象。没有“静态”对象,没有提前初始化的东西,没有。

此方法将在数组中的对象上调用,其参数将是数组中的另一个对象,它应该将第一个对象与其进行比较(其中) self论证)。 sortUsingSelector:的实现使用此方法的返回值来确定两个对象的顺序是否正确。在内部,它被称为:

id oneObject = array[firstIndex];
id otherObject = array[secondIndex];

NSComparisonResult cmpRes =
    [oneObject performSelector:@selector(comparisonSelector)
                    withObject:otherObject];

if (cmpRes == NSOrderedDescending) {
    // swap the objects if they're in the wrong order
}

也许不对称令人困惑;原则上,NSArray也可以使用一个独立的函数来获取两个对象并返回比较结果。实际上,确实有一个方法(sortUsingComparator:)采用一个未被称为“在一个对象上”的块(因为它不是一个方法),但它只是用两个参数调用:两个要比较的对象。

答案 1 :(得分:0)

这很简单。排序算法基于对象比较。假设我们在数组中有3个对象:[A, B, C]

然后在以下对象上调用方法compareNames:

[A compareNames:B] [B compareNames:C] [A compareNames:C]

element只是数组中的其他一些对象。