我正在读一本关于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
只是数组中的其他一些对象。