对objective-C数组进行排序:'element'从何而来?



我正在读一本关于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 book打印[32]。但是"元素"如何适应呢?

我得到的"名称",因为之前已经初始化了。

我不确定你是否理解这是如何工作的。与排序选择器对应的方法必须比较作为数组成员的两个对象。没有"静态"对象,没有提前初始化的东西,什么都没有。

此方法将在数组中的对象调用,其参数将是数组中的另一个对象,它应将第一个对象(其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:)接受一个不称为"在对象上"的块(因为它不是一个方法),而是简单地用两个参数调用它:要比较的两个对象。

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

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

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

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

相关内容

最新更新