我正在读一本关于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]打印出来。但是'元素'如何适合呢?
答案 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
只是数组中的其他一些对象。