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

ソートの実装によっては、ソート アルゴリズムが 2 つの要素を比較する必要があるたびに、これが呼び出されます。何が渡されるかを実際に知る必要はありません。渡される型の順序関係を定義するだけです。彼が知る必要があることを尋ねます。

于 2013-01-02T21:06:54.563 に答える
0

あなたの質問に答えるブロックに関するいくつかの追加情報。ブロックは変数に割り当てられ、関数のように呼び出されます。sortUsingComparator: メソッドのシグネチャは次のとおりです。

- (void)sortUsingComparator:(NSComparator)cmptr

cmptr は、ブロックを保持する変数です。sortUsingComparator: メソッドは、並べ替えアルゴリズムを介して配列内のすべての要素を実行し、Fernando が指摘したように、並べ替えアルゴリズムが 2 つの要素を比較する必要があるたびに、次のように呼び出されます。

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 に答える