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] によって要素を出力する方法について説明しました。このアドレス帳の場合、そのブック内の 1 つの要素またはカードを NSLogging book[32] で印刷できます。しかし、「要素」はそれにどのように適合しますか?

4

2 に答える 2

2

私が取得した「名前」は、以前に初期化された原因です。

これがどのように機能するかを理解しているかどうかはわかりません。並べ替えセレクターに対応するメソッドは、配列のメンバーである 2 つのオブジェクトを比較する必要があります。「静的」オブジェクトも、事前に初期化されたものも何もありません。

このメソッドは配列内のオブジェクトで呼び出され、その引数は配列内の別のオブジェクトになり、最初のオブジェクト (そのself引数) と比較する必要があります。の実装でsortUsingSelector:は、このメソッドの戻り値を使用して、2 つのオブジェクトが正しい順序であるかどうかを判断します。内部的には、次のように呼び出されます。

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
}

非対称性は混乱を招く可能性があります。原則として、NSArray2 つのオブジェクトを取り、比較結果を返す独立した関数を使用することもできます。実際には、sortUsingComparator:「オブジェクト上」で呼び出されないブロックを取るメソッド ( ) がありますが (メソッドではないため)、単純に 2 つの引数 (比較する 2 つのオブジェクト) で呼び出されます。

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