0

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

4

2 回答 2

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:) 接受一个没有在“对象上”调用的块(因为它不是一个方法),但它只是用两个参数调用:要比较的两个对象。

于 2013-11-01T13:24:14.833 回答
0

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

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

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

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

于 2013-11-01T13:22:50.590 回答