1

我正试图围绕块编程,目前陷入这个问题

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
    char *left = *(char **)l;
    char *right = *(char **)r;
    return strncmp(left, right, 1); 
});

在第二行块参数^(const void *l, const void *r),它从那里得到它的参数值。

来自 Apple块编程主题文档:

可可块

Cocoa 框架中的一些方法将块作为参数,通常要么对对象集合执行操作,要么在操作完成后用作回调。下面的例子展示了如何使用带有 NSArray 方法 sortedArrayUsingComparator: 的块。该方法接受一个参数——块。为了说明,在这种情况下,块被定义为 NSComparator 局部变量:

“在这种情况下,块被定义为 NSComparator 局部变量”是什么意思?

这是提供的代码示例

NSArray *stringsArray = @[ @"string 1",
                         @"String 21",
                         @"string 12",
                         @"String 11",
                         @"String 02" ];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch |
                                                  NSNumericSearch |
                                                  NSWidthInsensitiveSearch |
                                                  NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSComparator finderSortBlock = ^(id string1, id string2) {
    NSRange string1Range = NSMakeRange(0, [string1 length]);
    return [string1 compare:string2 
                    options:comparisonOptions 
                      range:string1Range
                     locale:currentLocale];
};
NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];     
NSLog(@"finderSortArray: %@", finderSortArray);

从哪里^(id string1, id string2)得到它的参数值?

4

1 回答 1

2

NSComparator实际上是一个如下类型转换的块,与ortypedef NSComparisonResult (^NSComparator)(id obj1, id obj2);相同。由于它是一个块,格式与参数略有不同。基本上是一个块,它接受两个参数并返回一个值来表示两个对象的顺序。它可以返回 ,或。这可以用于重复比较数组中的两个对象并根据它对其进行排序。这也有助于实现我们自己的排序实现。当排序发生时,该块被调用,并为该块提供值并执行该块。根据我们实施的比较,它从该块返回。typedef double NSTimeInterval;typedef long NSInteger;NSComparatorobj1obj2NSComparisonResultNSOrderedAscendingNSOrderedSameNSOrderedDescendingsortedArrayUsingComparatorsortedArrayUsingComparatorobj1obj2NSComparatorNSComparisonResult

于 2012-11-07T08:35:17.937 回答