0

オブジェクト内に格納されている変数に基づいて並べ替える必要のあるNSArrayがあります(この場合、クラス名はUIViewControllerであるSchedViewです)。NSArrayで「メンバー関数」を渡せると思っていました(Objective-Cで使用されている用語かどうかはわかりませんが、この言語は初めてです)。ただし、静的/ Cスタイルの関数しか渡せないようです。そのため、最終的には次のようになりました。

- (NSInteger) BuildGridSortCompare :(id) r1 :(id) r2 :(void*) context
{
    // Have compare code here, and can use class scope variables...

    return NSOrderedSame;
}

NSInteger _BuildGridSortCompare(id r1,id r2,void *context)
{
    SchedView *sv = (__bridge SchedView*) context;
    return [sv BuildGridSortCompare:r1 :r2 :NULL];
}

- (void)BuildGrid
{
    Records = [Records sortedArrayUsingFunction:_BuildGridSortCompare context:(__bridge void *)(self)];
}

BuildGridとBuildGridSortCompareは、私のSchedViewクラス(セレクター?)のメンバー関数です。_BuildGridSortCompareは基本的にCスタイルの関数であり、メンバー関数を呼び出すための単なるラッパーです。

私は以前にこのデザインをC/C ++コードで使用しましたが、JavaやC#などの最新のプラットフォームでは使用していなかったので、Objective-Cの方が良い方法かもしれないと思いましたか?

いくつかのタイプキャストについてもよくわかりませんが、ほとんどは__bridgeです。

私が行っていることは安全ですか、それともメンバー関数を使用できるようにするsortedArrayUsingFunctionに似た別の関数がありますか?私はsortedArrayUsingSelectorを見ましたが、それは私がソートしているクラスの関数を呼び出すようです。この場合、関数を自分で実装したいと思います。

4

2 に答える 2

1

あなたのコードは大丈夫だと思いますが、ブロックを使用してこれをはるかにエレガントに行うことができます:

records = [records sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    // compare code here, can use self etc.
    return ...;
}];
于 2012-10-09T17:39:31.600 に答える
0

コードは問題ないようです。これらの2つの方法のいずれかを使用して、iOSで配列を並べ替える方が便利です。

  1. sortedArrayUsingSelector:これは、セレクターをパラメーターとして渡すことを意味します。これを使用する場合は、配列の型にすでに存在する比較メソッドでセレクターを使用できます。たとえば、NSNumberの配列がある場合、@ selector(compare)を渡すことができます。これにより、NSSNumberオブジェクトのcompareメソッドが呼び出されます。これが事前定義タイプでない場合は、オブジェクトに対して独自のcompare-methodを実装する必要がある場合があります。

  2. sortedArrayUsingComparator:これは、パラメータとしてブロックを渡すことを意味します。これは、より光沢があると思います。

于 2012-10-09T17:46:53.253 に答える