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); 
});

2行目では、ブロックパラメータ^(const void *l, const void *r)、そこからパラメータ値を取得しています。

Apple Block ProgrammingTopicsのドキュメントから:

ココアのブロック

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);と同じように、次のように型キャストされたブロックです。ブロックなので、引数で若干フォーマットが異なります。基本的には、2 つのパラメーターを受け取り、2 つのオブジェクトの順序を示す値を返すブロックです。、またはを返すことができ ます。これは、配列内の 2 つのオブジェクトを繰り返し比較し、それに基づいて並べ替えるために使用できます。これは、ソートのための独自の実装の実装にも役立ちます。並べ替えが行われると、このブロックが呼び出されて値が渡され、ブロックが実行されます。そのブロックから、実装した比較に基づいて返されます。typedef double NSTimeInterval;typedef long NSInteger;NSComparatorobj1obj2NSComparisonResultNSOrderedAscendingNSOrderedSameNSOrderedDescendingsortedArrayUsingComparatorsortedArrayUsingComparatorobj1obj2NSComparatorNSComparisonResult

于 2012-11-07T08:35:17.937 に答える