0

我正在学习Objective-C,并试图让我的头脑围绕使用块的想法。

在我看到的一个示例中,有一种方法旨在按名称按字母顺序对名为 book 的 NSArray 进行排序:

-(void) sort
{
    [book sortUsingComparator:
        ^(id obj1, id obj2) {
            return [[obj1 name] compare: [obj2 name]];
    } ];
}

该方法如何将对象传递给 obj1 和 obj2 参数?sortUsingComparator 是否以某种方式自动将 2 个对象传递给它的比较器?

4

4 回答 4

1

sortUsingComparator:遍历数组并使用各种对象对调用块以确定如何对它们进行排序。这里没有魔法——它是一个普通的排序函数,但它使用你的块而不是>比较值。

于 2013-01-02T21:06:35.240 回答
1

好吧,取决于排序的实现,每次排序算法需要比较两个元素时,都会调用它。您实际上不需要知道将传递给它的内容,只需为传递的类型定义顺序关系即可。它会问他需要知道什么。

于 2013-01-02T21:06:54.563 回答
0

关于回答您问题的块的一些额外信息,可以将块分配给变量并像函数一样调用。sortUsingComparator: 方法签名是:

- (void)sortUsingComparator:(NSComparator)cmptr

cmptr 是保存你的块的变量。sortUsingComparator: 方法将通过其排序算法运行数组中的每个元素,正如费尔南多指出的那样,每次排序算法需要比较两个元素时,它的调用方式如下:

NSComparisonResult result = cmptr(obj1, obj2);

并且您的块代码被执行。所以你的问题的答案:

sortUsingComparator 是否以某种方式自动将 2 个对象传递给它的比较器?

是是的 :)

于 2013-01-03T00:41:08.090 回答
0

sort 方法会做这样的事情(我并没有声称该sort:方法完全可以做到这一点,但这个想法仍然存在):

for (i = 0; i < [book count]; i++) {
    id currentObject = [book objectAtIndex:i];      // obj1
    for (j = 0; j < i; j++) {
        id sortedObject = [book objectAtIndex:j];   // obj2
        NSComparisonResult result = sortBlock(currentObject, sortedObject);
        // Insert currentObject where appropriate; perform the rest of the sort
    }
}

在这种情况下,我假设块的参数名称是^sortBlock(插入符号表示块)。您可以像普通函数一样调用块,使用括号和参数。

因此,要回答您的问题……从某种意义上说,这是自动的,不必考虑它,但是没有魔术发生。希望这可以帮助!

于 2013-01-04T22:51:45.310 回答